diff --git a/404.html b/404.html index 9bceacaf72b..3d8c4e2e3ef 100644 --- a/404.html +++ b/404.html @@ -7,13 +7,13 @@ - +
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/ar/404.html b/ar/404.html index 9a2ad0debc5..047dbb33409 100644 --- a/ar/404.html +++ b/ar/404.html @@ -7,13 +7,13 @@ - +
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/ar/assets/js/1bf8374c.a4e048e9.js b/ar/assets/js/1bf8374c.a4e048e9.js new file mode 100644 index 00000000000..a012d6d035f --- /dev/null +++ b/ar/assets/js/1bf8374c.a4e048e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5791],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},6065:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ar/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ar/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ar/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ar/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ar/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ar/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ar/assets/js/1bf8374c.e9356655.js b/ar/assets/js/1bf8374c.e9356655.js deleted file mode 100644 index c3e9f51d8f6..00000000000 --- a/ar/assets/js/1bf8374c.e9356655.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5791],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},6065:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ar/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ar/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ar/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ar/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ar/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ar/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ar/assets/js/6f4d6051.b0340269.js b/ar/assets/js/6f4d6051.b0340269.js new file mode 100644 index 00000000000..8afb4b33d1d --- /dev/null +++ b/ar/assets/js/6f4d6051.b0340269.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2602],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5848:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ar/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ar/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ar/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ar/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ar/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ar/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ar/assets/js/6f4d6051.bb6dae0e.js b/ar/assets/js/6f4d6051.bb6dae0e.js deleted file mode 100644 index b3380717de7..00000000000 --- a/ar/assets/js/6f4d6051.bb6dae0e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2602],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5848:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ar/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ar/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ar/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ar/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ar/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ar/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ar/assets/js/runtime~main.02c6da33.js b/ar/assets/js/runtime~main.b6432a5a.js similarity index 98% rename from ar/assets/js/runtime~main.02c6da33.js rename to ar/assets/js/runtime~main.b6432a5a.js index 2b3c1bca5a3..44d9e6c9c63 100644 --- a/ar/assets/js/runtime~main.02c6da33.js +++ b/ar/assets/js/runtime~main.b6432a5a.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({1:"6cb84887",25:"db591d68",53:"935f2afb",332:"1993b00e",581:"d9bb8be0",688:"135ed781",726:"e0e0d68b",854:"133abaa6",993:"5e7c8a87",1020:"245628ab",1322:"13f57468",1420:"c0d5e683",1507:"84440eaf",1995:"729d3c2d",2108:"4307197e",2155:"d85759ec",2189:"021fdf0c",2209:"e3571471",2449:"2c4725ed",2563:"e5e6b2c0",2602:"6f4d6051",2636:"e7c50ba8",2748:"90cb62da",3085:"1f391b9e",3112:"44c8086f",3138:"d77289d8",3140:"591cbbf5",3191:"e1235d01",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3302:"9eff6142",3330:"7715827f",3395:"d4cca1c8",3396:"2a36a94e",3445:"85c71c89",3459:"ad9cb82b",3469:"2af3625b",3568:"9a118183",3794:"28d7dd2a",3804:"1c441aff",3957:"14ba5576",4036:"5816f9a5",4328:"b39d28ca",4452:"d05a0031",4571:"9c062352",4737:"f9cbf9e5",4815:"17d9b19a",4881:"25bc7e92",4991:"84ac1dca",5003:"5c040552",5127:"824fdee4",5217:"183d9524",5317:"6c712bcc",5357:"9e05f6b1",5490:"7a6bb932",5626:"6f287da4",5750:"0c7a9c77",5791:"1bf8374c",6054:"86843744",6082:"77292d92",6132:"6c0ba738",6157:"acd1501e",6185:"3d8a38ae",6195:"563cb35f",6209:"702c13b8",6411:"af84bfa0",6439:"1518dabe",6591:"1d33e2b1",6708:"3f66129c",6740:"b9f4def8",6887:"7adc8f35",6931:"83a50e82",6932:"1e1adddd",7099:"00201e67",7370:"c09f4ff7",7414:"393be207",7859:"3bc74349",7918:"17896441",8003:"c228f800",8025:"bab229de",8168:"4ff1fdfd",8402:"56bc947e",8645:"dc9ad76b",8659:"bf4a2027",8732:"821ae14c",8889:"fac888b6",8912:"18cef817",8939:"743fe6dc",8950:"62d0db3f",9044:"7e20936c",9321:"78d5669b",9480:"1432fe29",9514:"1be78505",9634:"0b6fd7a8",9817:"14eb3368",9835:"fc7c6da4",9888:"52b06446"}[e]||e)+"."+{1:"b94a6b1b",25:"a1196930",53:"af5fead1",332:"073c8fc5",581:"7b2a8401",688:"4e756fc3",726:"2803152a",814:"dc8c3a26",854:"5eb28847",993:"4822ab16",1020:"e15de902",1322:"2176c674",1420:"8a90350f",1507:"10fa0b2f",1995:"74c0b726",2108:"8f30b401",2155:"9aec87be",2189:"546fb0d2",2209:"a8cfd0a8",2449:"1bb13406",2563:"4de3e9e7",2602:"bb6dae0e",2636:"ed3dfaf2",2748:"3ce62ba2",3085:"3a447380",3112:"f0fbc7e7",3138:"623df5cf",3140:"0d422bc3",3191:"d5da85bd",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3302:"6d06b979",3330:"d381773f",3395:"ca223c9e",3396:"3d013ac1",3445:"f192c39e",3459:"e15e74f8",3469:"6a75fca8",3473:"fdffa07c",3568:"6a620bf5",3794:"8641818a",3804:"6edc9c64",3957:"03f66648",4036:"280afa2a",4328:"33fb125e",4452:"bd031d28",4571:"3f34955b",4737:"7cf76c74",4815:"a120fe8d",4881:"129c45ec",4972:"4a54fd4a",4991:"dbd33652",5003:"c6937802",5127:"4aa42216",5217:"fddab19a",5317:"57d67931",5357:"d211ed0b",5490:"8e431d93",5626:"e28653e9",5750:"01721122",5791:"e9356655",6054:"91e2d4e6",6082:"4471815d",6132:"7acbade7",6157:"2764ec4c",6185:"83e668de",6195:"936e0557",6209:"3a567b6f",6411:"a6c1328e",6439:"6142b8a7",6591:"80a579cb",6708:"d79a5a1e",6740:"6cf4c76b",6887:"708f79f5",6931:"ba100ee0",6932:"09ae3011",7099:"2bf2f3a1",7370:"d0fec06f",7414:"e250e0cb",7859:"e68aac10",7918:"e3da5265",8003:"c0650fe8",8025:"f1e6b636",8168:"45943564",8402:"503a8d4d",8645:"005460d2",8659:"57b4ef3f",8732:"520f6b85",8889:"34941d6b",8912:"150321df",8939:"b386063c",8950:"3cce27ce",9044:"91d74a20",9321:"6b3b5ae3",9480:"a0ea4982",9514:"478c02c6",9634:"58457aa6",9817:"b7ea7ab7",9835:"246df650",9888:"aad85696"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="portal:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/ar/",r.gca=function(e){return e={17896441:"7918",86843744:"6054","6cb84887":"1",db591d68:"25","935f2afb":"53","1993b00e":"332",d9bb8be0:"581","135ed781":"688",e0e0d68b:"726","133abaa6":"854","5e7c8a87":"993","245628ab":"1020","13f57468":"1322",c0d5e683:"1420","84440eaf":"1507","729d3c2d":"1995","4307197e":"2108",d85759ec:"2155","021fdf0c":"2189",e3571471:"2209","2c4725ed":"2449",e5e6b2c0:"2563","6f4d6051":"2602",e7c50ba8:"2636","90cb62da":"2748","1f391b9e":"3085","44c8086f":"3112",d77289d8:"3138","591cbbf5":"3140",e1235d01:"3191",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","9eff6142":"3302","7715827f":"3330",d4cca1c8:"3395","2a36a94e":"3396","85c71c89":"3445",ad9cb82b:"3459","2af3625b":"3469","9a118183":"3568","28d7dd2a":"3794","1c441aff":"3804","14ba5576":"3957","5816f9a5":"4036",b39d28ca:"4328",d05a0031:"4452","9c062352":"4571",f9cbf9e5:"4737","17d9b19a":"4815","25bc7e92":"4881","84ac1dca":"4991","5c040552":"5003","824fdee4":"5127","183d9524":"5217","6c712bcc":"5317","9e05f6b1":"5357","7a6bb932":"5490","6f287da4":"5626","0c7a9c77":"5750","1bf8374c":"5791","77292d92":"6082","6c0ba738":"6132",acd1501e:"6157","3d8a38ae":"6185","563cb35f":"6195","702c13b8":"6209",af84bfa0:"6411","1518dabe":"6439","1d33e2b1":"6591","3f66129c":"6708",b9f4def8:"6740","7adc8f35":"6887","83a50e82":"6931","1e1adddd":"6932","00201e67":"7099",c09f4ff7:"7370","393be207":"7414","3bc74349":"7859",c228f800:"8003",bab229de:"8025","4ff1fdfd":"8168","56bc947e":"8402",dc9ad76b:"8645",bf4a2027:"8659","821ae14c":"8732",fac888b6:"8889","18cef817":"8912","743fe6dc":"8939","62d0db3f":"8950","7e20936c":"9044","78d5669b":"9321","1432fe29":"9480","1be78505":"9514","0b6fd7a8":"9634","14eb3368":"9817",fc7c6da4:"9835","52b06446":"9888"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({1:"6cb84887",25:"db591d68",53:"935f2afb",332:"1993b00e",581:"d9bb8be0",688:"135ed781",726:"e0e0d68b",854:"133abaa6",993:"5e7c8a87",1020:"245628ab",1322:"13f57468",1420:"c0d5e683",1507:"84440eaf",1995:"729d3c2d",2108:"4307197e",2155:"d85759ec",2189:"021fdf0c",2209:"e3571471",2449:"2c4725ed",2563:"e5e6b2c0",2602:"6f4d6051",2636:"e7c50ba8",2748:"90cb62da",3085:"1f391b9e",3112:"44c8086f",3138:"d77289d8",3140:"591cbbf5",3191:"e1235d01",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3302:"9eff6142",3330:"7715827f",3395:"d4cca1c8",3396:"2a36a94e",3445:"85c71c89",3459:"ad9cb82b",3469:"2af3625b",3568:"9a118183",3794:"28d7dd2a",3804:"1c441aff",3957:"14ba5576",4036:"5816f9a5",4328:"b39d28ca",4452:"d05a0031",4571:"9c062352",4737:"f9cbf9e5",4815:"17d9b19a",4881:"25bc7e92",4991:"84ac1dca",5003:"5c040552",5127:"824fdee4",5217:"183d9524",5317:"6c712bcc",5357:"9e05f6b1",5490:"7a6bb932",5626:"6f287da4",5750:"0c7a9c77",5791:"1bf8374c",6054:"86843744",6082:"77292d92",6132:"6c0ba738",6157:"acd1501e",6185:"3d8a38ae",6195:"563cb35f",6209:"702c13b8",6411:"af84bfa0",6439:"1518dabe",6591:"1d33e2b1",6708:"3f66129c",6740:"b9f4def8",6887:"7adc8f35",6931:"83a50e82",6932:"1e1adddd",7099:"00201e67",7370:"c09f4ff7",7414:"393be207",7859:"3bc74349",7918:"17896441",8003:"c228f800",8025:"bab229de",8168:"4ff1fdfd",8402:"56bc947e",8645:"dc9ad76b",8659:"bf4a2027",8732:"821ae14c",8889:"fac888b6",8912:"18cef817",8939:"743fe6dc",8950:"62d0db3f",9044:"7e20936c",9321:"78d5669b",9480:"1432fe29",9514:"1be78505",9634:"0b6fd7a8",9817:"14eb3368",9835:"fc7c6da4",9888:"52b06446"}[e]||e)+"."+{1:"b94a6b1b",25:"a1196930",53:"af5fead1",332:"073c8fc5",581:"7b2a8401",688:"4e756fc3",726:"2803152a",814:"dc8c3a26",854:"5eb28847",993:"4822ab16",1020:"e15de902",1322:"2176c674",1420:"8a90350f",1507:"10fa0b2f",1995:"74c0b726",2108:"8f30b401",2155:"9aec87be",2189:"546fb0d2",2209:"a8cfd0a8",2449:"1bb13406",2563:"4de3e9e7",2602:"b0340269",2636:"ed3dfaf2",2748:"3ce62ba2",3085:"3a447380",3112:"f0fbc7e7",3138:"623df5cf",3140:"0d422bc3",3191:"d5da85bd",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3302:"6d06b979",3330:"d381773f",3395:"ca223c9e",3396:"3d013ac1",3445:"f192c39e",3459:"e15e74f8",3469:"6a75fca8",3473:"fdffa07c",3568:"6a620bf5",3794:"8641818a",3804:"6edc9c64",3957:"03f66648",4036:"280afa2a",4328:"33fb125e",4452:"bd031d28",4571:"3f34955b",4737:"7cf76c74",4815:"a120fe8d",4881:"129c45ec",4972:"4a54fd4a",4991:"dbd33652",5003:"c6937802",5127:"4aa42216",5217:"fddab19a",5317:"57d67931",5357:"d211ed0b",5490:"8e431d93",5626:"e28653e9",5750:"01721122",5791:"a4e048e9",6054:"91e2d4e6",6082:"4471815d",6132:"7acbade7",6157:"2764ec4c",6185:"83e668de",6195:"936e0557",6209:"3a567b6f",6411:"a6c1328e",6439:"6142b8a7",6591:"80a579cb",6708:"d79a5a1e",6740:"6cf4c76b",6887:"708f79f5",6931:"ba100ee0",6932:"09ae3011",7099:"2bf2f3a1",7370:"d0fec06f",7414:"e250e0cb",7859:"e68aac10",7918:"e3da5265",8003:"c0650fe8",8025:"f1e6b636",8168:"45943564",8402:"503a8d4d",8645:"005460d2",8659:"57b4ef3f",8732:"520f6b85",8889:"34941d6b",8912:"150321df",8939:"b386063c",8950:"3cce27ce",9044:"91d74a20",9321:"6b3b5ae3",9480:"a0ea4982",9514:"478c02c6",9634:"58457aa6",9817:"b7ea7ab7",9835:"246df650",9888:"aad85696"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="portal:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/ar/",r.gca=function(e){return e={17896441:"7918",86843744:"6054","6cb84887":"1",db591d68:"25","935f2afb":"53","1993b00e":"332",d9bb8be0:"581","135ed781":"688",e0e0d68b:"726","133abaa6":"854","5e7c8a87":"993","245628ab":"1020","13f57468":"1322",c0d5e683:"1420","84440eaf":"1507","729d3c2d":"1995","4307197e":"2108",d85759ec:"2155","021fdf0c":"2189",e3571471:"2209","2c4725ed":"2449",e5e6b2c0:"2563","6f4d6051":"2602",e7c50ba8:"2636","90cb62da":"2748","1f391b9e":"3085","44c8086f":"3112",d77289d8:"3138","591cbbf5":"3140",e1235d01:"3191",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","9eff6142":"3302","7715827f":"3330",d4cca1c8:"3395","2a36a94e":"3396","85c71c89":"3445",ad9cb82b:"3459","2af3625b":"3469","9a118183":"3568","28d7dd2a":"3794","1c441aff":"3804","14ba5576":"3957","5816f9a5":"4036",b39d28ca:"4328",d05a0031:"4452","9c062352":"4571",f9cbf9e5:"4737","17d9b19a":"4815","25bc7e92":"4881","84ac1dca":"4991","5c040552":"5003","824fdee4":"5127","183d9524":"5217","6c712bcc":"5317","9e05f6b1":"5357","7a6bb932":"5490","6f287da4":"5626","0c7a9c77":"5750","1bf8374c":"5791","77292d92":"6082","6c0ba738":"6132",acd1501e:"6157","3d8a38ae":"6185","563cb35f":"6195","702c13b8":"6209",af84bfa0:"6411","1518dabe":"6439","1d33e2b1":"6591","3f66129c":"6708",b9f4def8:"6740","7adc8f35":"6887","83a50e82":"6931","1e1adddd":"6932","00201e67":"7099",c09f4ff7:"7370","393be207":"7414","3bc74349":"7859",c228f800:"8003",bab229de:"8025","4ff1fdfd":"8168","56bc947e":"8402",dc9ad76b:"8645",bf4a2027:"8659","821ae14c":"8732",fac888b6:"8889","18cef817":"8912","743fe6dc":"8939","62d0db3f":"8950","7e20936c":"9044","78d5669b":"9321","1432fe29":"9480","1be78505":"9514","0b6fd7a8":"9634","14eb3368":"9817",fc7c6da4:"9835","52b06446":"9888"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/ar/docs/category/advanced-cli/index.html b/ar/docs/category/advanced-cli/index.html index 9557b5570a0..750fbd605d1 100644 --- a/ar/docs/category/advanced-cli/index.html +++ b/ar/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/category/develop-on-nova-evm-/index.html b/ar/docs/category/develop-on-nova-evm-/index.html index 8a5822cab10..092b92ed85d 100644 --- a/ar/docs/category/develop-on-nova-evm-/index.html +++ b/ar/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
- + \ No newline at end of file diff --git a/ar/docs/category/develop/index.html b/ar/docs/category/develop/index.html index d0a0420a15b..7fd7bb6a1e2 100644 --- a/ar/docs/category/develop/index.html +++ b/ar/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/category/farming/index.html b/ar/docs/category/farming/index.html index ead3493258b..45babbb66d0 100644 --- a/ar/docs/category/farming/index.html +++ b/ar/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/category/learn/index.html b/ar/docs/category/learn/index.html index d571d9f03fd..c5d83a26424 100644 --- a/ar/docs/category/learn/index.html +++ b/ar/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/category/operators-and-nominators/index.html b/ar/docs/category/operators-and-nominators/index.html index 7ce2c4fb6a8..260824d1f9a 100644 --- a/ar/docs/category/operators-and-nominators/index.html +++ b/ar/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/category/participate/index.html b/ar/docs/category/participate/index.html index 378ac902c19..fabe9eea4ba 100644 --- a/ar/docs/category/participate/index.html +++ b/ar/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/category/pulsar-recommended/index.html b/ar/docs/category/pulsar-recommended/index.html index c52a768d1ca..014b505c5e5 100644 --- a/ar/docs/category/pulsar-recommended/index.html +++ b/ar/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/category/wallets/index.html b/ar/docs/category/wallets/index.html index baa12ba0c1a..2ab6b91e0f6 100644 --- a/ar/docs/category/wallets/index.html +++ b/ar/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/develop/nova/block_explorer/index.html b/ar/docs/develop/nova/block_explorer/index.html index e235bbdb87a..72dfb8df2fa 100644 --- a/ar/docs/develop/nova/block_explorer/index.html +++ b/ar/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/develop/nova/faucet/index.html b/ar/docs/develop/nova/faucet/index.html index ab5ca77e136..57fd4a28174 100644 --- a/ar/docs/develop/nova/faucet/index.html +++ b/ar/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/ar/docs/develop/nova/foundry_guide/index.html b/ar/docs/develop/nova/foundry_guide/index.html index 7a51750edcb..7a822762f1a 100644 --- a/ar/docs/develop/nova/foundry_guide/index.html +++ b/ar/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/ar/docs/develop/nova/general-information/index.html b/ar/docs/develop/nova/general-information/index.html index 796066638c2..b0300d258f5 100644 --- a/ar/docs/develop/nova/general-information/index.html +++ b/ar/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/ar/docs/develop/nova/hardhat_guide/index.html b/ar/docs/develop/nova/hardhat_guide/index.html index 412bfee0760..3131e8a5eaf 100644 --- a/ar/docs/develop/nova/hardhat_guide/index.html +++ b/ar/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/ar/docs/develop/nova/intro/index.html b/ar/docs/develop/nova/intro/index.html index 93a490b294c..9162e2906d8 100644 --- a/ar/docs/develop/nova/intro/index.html +++ b/ar/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/ar/docs/develop/nova/local_development/index.html b/ar/docs/develop/nova/local_development/index.html index c50b476bb43..9990e460e46 100644 --- a/ar/docs/develop/nova/local_development/index.html +++ b/ar/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/ar/docs/develop/nova/quick_start/index.html b/ar/docs/develop/nova/quick_start/index.html index c7a51110fc5..bede1dbc60d 100644 --- a/ar/docs/develop/nova/quick_start/index.html +++ b/ar/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/ar/docs/develop/nova/remix_guide/index.html b/ar/docs/develop/nova/remix_guide/index.html index 90f1c9be83f..8831016bad7 100644 --- a/ar/docs/develop/nova/remix_guide/index.html +++ b/ar/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/ar/docs/develop/nova/setting-up-metamask/index.html b/ar/docs/develop/nova/setting-up-metamask/index.html index fa8b9b00cb5..afb1777d823 100644 --- a/ar/docs/develop/nova/setting-up-metamask/index.html +++ b/ar/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/ar/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index f7143da7230..d7718509467 100644 --- a/ar/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/ar/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/ar/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 5187724d0a8..cad093c6d1a 100644 --- a/ar/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/ar/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/ar/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 680e2629b1e..962a2ad718e 100644 --- a/ar/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/ar/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/ar/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index c97fedb24fd..a9559fb186a 100644 --- a/ar/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/ar/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/ar/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 7f8a87eadc5..5f4f063bdd4 100644 --- a/ar/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/ar/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/common_problems/index.html b/ar/docs/farming-&-staking/farming/common_problems/index.html index 243cdcad1cb..29c4964e944 100644 --- a/ar/docs/farming-&-staking/farming/common_problems/index.html +++ b/ar/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/ar/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 5c71fd38d7d..93a1257c48d 100644 --- a/ar/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/ar/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/ar/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 86e117aaedd..ee9bd02c626 100644 --- a/ar/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/ar/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/ar/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 332db707b9f..8284a12a1c7 100644 --- a/ar/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/ar/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/ar/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index bb66967094d..33df2e6a387 100644 --- a/ar/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/ar/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/index.html b/ar/docs/farming-&-staking/index.html index 29c19d8f372..c9087a374f6 100644 --- a/ar/docs/farming-&-staking/index.html +++ b/ar/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/staking/index.html b/ar/docs/farming-&-staking/staking/index.html index 23d4e250e60..c4cba59447d 100644 --- a/ar/docs/farming-&-staking/staking/index.html +++ b/ar/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/staking/intro/index.html b/ar/docs/farming-&-staking/staking/intro/index.html index 1c22829d64e..62cb7b5f6c6 100644 --- a/ar/docs/farming-&-staking/staking/intro/index.html +++ b/ar/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/staking/operators/index.html b/ar/docs/farming-&-staking/staking/operators/index.html index b386c9de0be..7dbe63822ff 100644 --- a/ar/docs/farming-&-staking/staking/operators/index.html +++ b/ar/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/timekeeping/index.html b/ar/docs/farming-&-staking/timekeeping/index.html index 8dd85d484e4..7c980bf4281 100644 --- a/ar/docs/farming-&-staking/timekeeping/index.html +++ b/ar/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/wallets/polkadot/index.html b/ar/docs/farming-&-staking/wallets/polkadot/index.html index 08285d98489..30638d7e27e 100644 --- a/ar/docs/farming-&-staking/wallets/polkadot/index.html +++ b/ar/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/ar/docs/farming-&-staking/wallets/subwallet/index.html b/ar/docs/farming-&-staking/wallets/subwallet/index.html index 9c597aa0aea..7950425c429 100644 --- a/ar/docs/farming-&-staking/wallets/subwallet/index.html +++ b/ar/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/ar/docs/learn/intro/index.html b/ar/docs/learn/intro/index.html index d13aaae8027..06d8b0c9e89 100644 --- a/ar/docs/learn/intro/index.html +++ b/ar/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/ar/docs/learn/security/index.html b/ar/docs/learn/security/index.html index 50b6fa9f748..614f6e97b54 100644 --- a/ar/docs/learn/security/index.html +++ b/ar/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/ar/docs/learn/subnomicon/index.html b/ar/docs/learn/subnomicon/index.html index 4cac65d29dc..eb123fdb0de 100644 --- a/ar/docs/learn/subnomicon/index.html +++ b/ar/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/ar/docs/participate/CODE_OF_CONDUCT/index.html b/ar/docs/participate/CODE_OF_CONDUCT/index.html index 66565b64049..5206d2f5177 100644 --- a/ar/docs/participate/CODE_OF_CONDUCT/index.html +++ b/ar/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/ar/docs/participate/contribute/index.html b/ar/docs/participate/contribute/index.html index 856cf3118b4..ec4364325e1 100644 --- a/ar/docs/participate/contribute/index.html +++ b/ar/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/ar/docs/participate/index.html b/ar/docs/participate/index.html index ce69ee4f885..6d160d3268c 100644 --- a/ar/docs/participate/index.html +++ b/ar/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/ar/docs/participate/translate/index.html b/ar/docs/participate/translate/index.html index 5e4242750a6..9a0caaf7099 100644 --- a/ar/docs/participate/translate/index.html +++ b/ar/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/additional-guides/index.html b/ar/docs/pre-release/category/additional-guides/index.html index 35e489bc57c..6dc35d4ad74 100644 --- a/ar/docs/pre-release/category/additional-guides/index.html +++ b/ar/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/advanced-cli/index.html b/ar/docs/pre-release/category/advanced-cli/index.html index 6ba048c62a6..916b929641d 100644 --- a/ar/docs/pre-release/category/advanced-cli/index.html +++ b/ar/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/develop-on-nova-evm-/index.html b/ar/docs/pre-release/category/develop-on-nova-evm-/index.html index 279893785ea..ce7b5374161 100644 --- a/ar/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/ar/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/develop/index.html b/ar/docs/pre-release/category/develop/index.html index 6a2cf8a35cf..75051d2a172 100644 --- a/ar/docs/pre-release/category/develop/index.html +++ b/ar/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/farming/index.html b/ar/docs/pre-release/category/farming/index.html index 95d5733a287..f5cd56f2013 100644 --- a/ar/docs/pre-release/category/farming/index.html +++ b/ar/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/learn/index.html b/ar/docs/pre-release/category/learn/index.html index c04ad4034a6..77a3a238b0c 100644 --- a/ar/docs/pre-release/category/learn/index.html +++ b/ar/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/operators-and-nominators/index.html b/ar/docs/pre-release/category/operators-and-nominators/index.html index acf0e9fbbad..ac514f12ce4 100644 --- a/ar/docs/pre-release/category/operators-and-nominators/index.html +++ b/ar/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/participate/index.html b/ar/docs/pre-release/category/participate/index.html index 99e9adaf1dc..2fbe3059f3b 100644 --- a/ar/docs/pre-release/category/participate/index.html +++ b/ar/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/pulsar-recommended/index.html b/ar/docs/pre-release/category/pulsar-recommended/index.html index 4a2cfa5a8bc..658ca934654 100644 --- a/ar/docs/pre-release/category/pulsar-recommended/index.html +++ b/ar/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/category/wallets/index.html b/ar/docs/pre-release/category/wallets/index.html index 157f051af8f..13e1d758b67 100644 --- a/ar/docs/pre-release/category/wallets/index.html +++ b/ar/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/block_explorer/index.html b/ar/docs/pre-release/develop/nova/block_explorer/index.html index 803a1faa3f9..f31bc11174d 100644 --- a/ar/docs/pre-release/develop/nova/block_explorer/index.html +++ b/ar/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/faucet/index.html b/ar/docs/pre-release/develop/nova/faucet/index.html index 5f22e169b32..8a92408eac1 100644 --- a/ar/docs/pre-release/develop/nova/faucet/index.html +++ b/ar/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/foundry_guide/index.html b/ar/docs/pre-release/develop/nova/foundry_guide/index.html index e01d525b9dd..283e70b6bed 100644 --- a/ar/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/ar/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/general-information/index.html b/ar/docs/pre-release/develop/nova/general-information/index.html index 07de0ddacdc..7737dd3673c 100644 --- a/ar/docs/pre-release/develop/nova/general-information/index.html +++ b/ar/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/hardhat_guide/index.html b/ar/docs/pre-release/develop/nova/hardhat_guide/index.html index 0841dfef0ca..952b1987514 100644 --- a/ar/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/ar/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/intro/index.html b/ar/docs/pre-release/develop/nova/intro/index.html index ef50a673458..4698c26898d 100644 --- a/ar/docs/pre-release/develop/nova/intro/index.html +++ b/ar/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/local_development/index.html b/ar/docs/pre-release/develop/nova/local_development/index.html index e8ed0759425..ea889fd4d48 100644 --- a/ar/docs/pre-release/develop/nova/local_development/index.html +++ b/ar/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/quick_start/index.html b/ar/docs/pre-release/develop/nova/quick_start/index.html index 090da44c28c..88dbe2c45ca 100644 --- a/ar/docs/pre-release/develop/nova/quick_start/index.html +++ b/ar/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/remix_guide/index.html b/ar/docs/pre-release/develop/nova/remix_guide/index.html index c969133b850..d9bae2a7dee 100644 --- a/ar/docs/pre-release/develop/nova/remix_guide/index.html +++ b/ar/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/develop/nova/setting-up-metamask/index.html b/ar/docs/pre-release/develop/nova/setting-up-metamask/index.html index 2fc607c4410..8dac52dc3d9 100644 --- a/ar/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/ar/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/ar/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 5afafaebeb7..1a892d6d230 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index cbbdf3893bd..393a824b1bc 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 55bbd7a371b..e38f13e760e 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 1692894cdfe..ddff019b72b 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 2dd1dea7358..826950d20f7 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/ar/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 672b8f2ef61..f7e9342c139 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index fdde1d1da4d..7d597cd0880 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 43012daef1a..7862859d1b1 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index b313188f7ff..829fc4fd649 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 95150d308e1..2f2d8fa89bc 100644 --- a/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/ar/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/index.html b/ar/docs/pre-release/farming-&-staking/index.html index 345d23672c6..b7b7b95f454 100644 --- a/ar/docs/pre-release/farming-&-staking/index.html +++ b/ar/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/staking/index.html b/ar/docs/pre-release/farming-&-staking/staking/index.html index 0d5514a4a48..2d49be13b9f 100644 --- a/ar/docs/pre-release/farming-&-staking/staking/index.html +++ b/ar/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/staking/intro/index.html b/ar/docs/pre-release/farming-&-staking/staking/intro/index.html index 751e2c28637..50003c172f9 100644 --- a/ar/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/ar/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/staking/operators/index.html b/ar/docs/pre-release/farming-&-staking/staking/operators/index.html index 2d361401845..a8d5ecc4532 100644 --- a/ar/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/ar/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/timekeeping/index.html b/ar/docs/pre-release/farming-&-staking/timekeeping/index.html index d9a7201aeb0..1e27d30beab 100644 --- a/ar/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/ar/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/ar/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 92914fed557..7ad9e4993ab 100644 --- a/ar/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/ar/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/ar/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index e4690852831..44aa81c533f 100644 --- a/ar/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/ar/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/learn/intro/index.html b/ar/docs/pre-release/learn/intro/index.html index 86c7a8ba464..e4d911e50b7 100644 --- a/ar/docs/pre-release/learn/intro/index.html +++ b/ar/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/learn/security/index.html b/ar/docs/pre-release/learn/security/index.html index 44f8998345a..4e58b30478c 100644 --- a/ar/docs/pre-release/learn/security/index.html +++ b/ar/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/learn/subnomicon/index.html b/ar/docs/pre-release/learn/subnomicon/index.html index 7606bd618dc..e8157d35f14 100644 --- a/ar/docs/pre-release/learn/subnomicon/index.html +++ b/ar/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/ar/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index e695d372543..f35ef596b8f 100644 --- a/ar/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/ar/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/participate/contribute/index.html b/ar/docs/pre-release/participate/contribute/index.html index daed8476232..5900a2b3136 100644 --- a/ar/docs/pre-release/participate/contribute/index.html +++ b/ar/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/ar/docs/pre-release/participate/index.html b/ar/docs/pre-release/participate/index.html index f36a3cff93d..ddd53b343e3 100644 --- a/ar/docs/pre-release/participate/index.html +++ b/ar/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/ar/docs/pre-release/participate/translate/index.html b/ar/docs/pre-release/participate/translate/index.html index 36216d0ace5..31d9da6ea5c 100644 --- a/ar/docs/pre-release/participate/translate/index.html +++ b/ar/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/ar/index.html b/ar/index.html index 4e580f9c881..e6504c1a37c 100644 --- a/ar/index.html +++ b/ar/index.html @@ -7,13 +7,13 @@ - +

    مزرعة من أي مكان

    كسب المكافآت عن طريق تشغيل عقدة المزارع بواسطة تعهد القرص الفارغ. لا يلزم إعداد باهظ الثمن أو رأس مال مقدم.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/ar/markdown-page/index.html b/ar/markdown-page/index.html index 005b300e162..0c77a14cac2 100644 --- a/ar/markdown-page/index.html +++ b/ar/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/assets/js/0b3f8f9e.155dc01f.js b/assets/js/0b3f8f9e.155dc01f.js new file mode 100644 index 00000000000..c247800b2a6 --- /dev/null +++ b/assets/js/0b3f8f9e.155dc01f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[1334],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},3855:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/en/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/en/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/assets/js/0b3f8f9e.5dd8a47a.js b/assets/js/0b3f8f9e.5dd8a47a.js deleted file mode 100644 index b8b380faf33..00000000000 --- a/assets/js/0b3f8f9e.5dd8a47a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[1334],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},3855:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/en/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/en/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/assets/js/2e4ae8aa.023bce16.js b/assets/js/2e4ae8aa.023bce16.js new file mode 100644 index 00000000000..1b99ca36d83 --- /dev/null +++ b/assets/js/2e4ae8aa.023bce16.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2568],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7146:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/en/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/en/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/assets/js/2e4ae8aa.14d97db1.js b/assets/js/2e4ae8aa.14d97db1.js deleted file mode 100644 index 43a079b5b2b..00000000000 --- a/assets/js/2e4ae8aa.14d97db1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2568],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7146:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/en/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/en/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.ff3accf9.js b/assets/js/runtime~main.3becf9da.js similarity index 98% rename from assets/js/runtime~main.ff3accf9.js rename to assets/js/runtime~main.3becf9da.js index 35bdeb8996b..02b910452d2 100644 --- a/assets/js/runtime~main.ff3accf9.js +++ b/assets/js/runtime~main.3becf9da.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({48:"5e990467",53:"935f2afb",98:"ea1c4d9c",198:"cd7c2d77",234:"960820ba",312:"65738dd0",338:"fcf2ab4a",532:"796a85a4",684:"9077fac8",725:"25d8b80d",772:"83c81510",1287:"0db50651",1308:"233592aa",1334:"0b3f8f9e",1340:"088722c1",1612:"1168fff2",1616:"053f75fc",1645:"a9921181",1720:"058088ab",1769:"db294877",1815:"5e02abc9",1817:"653a7c45",1843:"a50f1aae",1863:"5769b8b8",1912:"7a340eac",2015:"b00bba07",2099:"569ca1c3",2313:"80be2a8a",2402:"ea5fa6de",2416:"5f08b4f2",2515:"1a681764",2568:"2e4ae8aa",2661:"c0701f9f",3031:"d111c479",3085:"1f391b9e",3104:"413a666c",3105:"22246754",3122:"733abea7",3126:"cb209646",3217:"6d200c2d",3235:"da6f36cd",3237:"1df93b7f",3263:"65c8fd9c",3280:"ef42b41f",3410:"8551d1ce",3450:"6580f360",3550:"56ea20cd",3590:"23e706d0",3692:"c8df9c33",3789:"36808404",3944:"cb437ed4",4123:"3486f30c",4271:"e14761ab",4373:"3a0bcb29",4489:"40112e03",4495:"7cec3784",4527:"bd17806f",4583:"4905fc56",5369:"43bcd13d",5387:"453504d6",5497:"f24868ee",5649:"abb3262a",5812:"03df22dd",5860:"e638209b",5985:"97f5f12b",6346:"41aaf8c0",6389:"58fb9b16",6517:"7a8c1c24",6863:"52c99585",6891:"86d9053f",7004:"562ee734",7201:"e591c1cc",7315:"bcceb52c",7370:"c09f4ff7",7414:"393be207",7656:"74f7db9b",7808:"ea18547f",7841:"0c7ae786",7884:"b8944823",7918:"17896441",7975:"36ae4492",8047:"01abbd2a",8082:"a6f71905",8094:"0d7e07a2",8119:"898fbce6",8500:"89e2a034",8603:"09873bbf",8671:"ccdb7d8e",8765:"dc1ffe41",8937:"549d4813",9043:"20c26c09",9291:"7b75dda3",9445:"aa9e0a32",9460:"adcafac5",9514:"1be78505",9529:"77aefabb",9817:"14eb3368",9910:"151c6df9"}[e]||e)+"."+{48:"d28a1ada",53:"3c26d6d5",98:"d5e2df55",198:"19a2c5ce",234:"5fbd001c",312:"f3582eb5",338:"27c25ea9",532:"dea22f76",684:"8e0ca2aa",725:"e85f2954",772:"3c430e85",814:"dc8c3a26",1287:"22702492",1308:"9dcff324",1334:"5dd8a47a",1340:"203ba318",1612:"27ae7cc2",1616:"48651b26",1645:"d4080e75",1720:"500fde84",1769:"0a45a9a4",1815:"66c97969",1817:"7516471f",1843:"6f21935e",1863:"0c866061",1912:"7f1c8dcf",2015:"0a966836",2099:"333f2df3",2313:"0582966e",2402:"1b057467",2416:"646f9038",2515:"b867aa98",2568:"14d97db1",2661:"3890bce0",3031:"7b3bbb06",3085:"3a447380",3104:"d1f8b721",3105:"086c4b00",3122:"8d809a53",3126:"faf3bf01",3203:"c0b8bfe8",3217:"9360f8ac",3235:"4cee896d",3237:"b8ec0c1b",3263:"1b2d1390",3280:"a28d7ef7",3410:"4465f085",3450:"03e766b6",3473:"fdffa07c",3550:"27b2533d",3590:"e743546e",3692:"812bc23e",3789:"e1b39532",3944:"f24544af",4123:"6768d5ac",4271:"c5946c61",4373:"5f4e1b45",4489:"39612770",4495:"5adfe37c",4527:"3c6f1908",4583:"d8eb0249",4972:"4a54fd4a",5369:"0778c062",5387:"11b40fd0",5497:"80f85594",5649:"63d60f8a",5812:"dbc88aa8",5860:"2e18361d",5985:"c1347759",6346:"ebc2cb5b",6389:"e4d80392",6517:"e42e9035",6863:"2e7784b8",6891:"b1f851de",7004:"884768fd",7201:"c1975ab9",7315:"c548d309",7370:"a8a58a29",7414:"f3c97f9b",7656:"64d152f1",7808:"d50d035b",7841:"680a1c78",7884:"f65f2baf",7918:"e3da5265",7975:"f4e88ac1",8047:"0ee72287",8082:"83439022",8094:"0c50d1c9",8119:"e1f470f6",8500:"f9a7ffeb",8603:"5f0efd6e",8671:"82171d3b",8765:"917030b2",8937:"6b37b55e",9043:"548a228a",9291:"279eec91",9445:"6c54c7ab",9460:"22d0e253",9514:"478c02c6",9529:"0284fea7",9817:"b7ea7ab7",9910:"88c50f11"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="portal:",r.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",22246754:"3105",36808404:"3789","5e990467":"48","935f2afb":"53",ea1c4d9c:"98",cd7c2d77:"198","960820ba":"234","65738dd0":"312",fcf2ab4a:"338","796a85a4":"532","9077fac8":"684","25d8b80d":"725","83c81510":"772","0db50651":"1287","233592aa":"1308","0b3f8f9e":"1334","088722c1":"1340","1168fff2":"1612","053f75fc":"1616",a9921181:"1645","058088ab":"1720",db294877:"1769","5e02abc9":"1815","653a7c45":"1817",a50f1aae:"1843","5769b8b8":"1863","7a340eac":"1912",b00bba07:"2015","569ca1c3":"2099","80be2a8a":"2313",ea5fa6de:"2402","5f08b4f2":"2416","1a681764":"2515","2e4ae8aa":"2568",c0701f9f:"2661",d111c479:"3031","1f391b9e":"3085","413a666c":"3104","733abea7":"3122",cb209646:"3126","6d200c2d":"3217",da6f36cd:"3235","1df93b7f":"3237","65c8fd9c":"3263",ef42b41f:"3280","8551d1ce":"3410","6580f360":"3450","56ea20cd":"3550","23e706d0":"3590",c8df9c33:"3692",cb437ed4:"3944","3486f30c":"4123",e14761ab:"4271","3a0bcb29":"4373","40112e03":"4489","7cec3784":"4495",bd17806f:"4527","4905fc56":"4583","43bcd13d":"5369","453504d6":"5387",f24868ee:"5497",abb3262a:"5649","03df22dd":"5812",e638209b:"5860","97f5f12b":"5985","41aaf8c0":"6346","58fb9b16":"6389","7a8c1c24":"6517","52c99585":"6863","86d9053f":"6891","562ee734":"7004",e591c1cc:"7201",bcceb52c:"7315",c09f4ff7:"7370","393be207":"7414","74f7db9b":"7656",ea18547f:"7808","0c7ae786":"7841",b8944823:"7884","36ae4492":"7975","01abbd2a":"8047",a6f71905:"8082","0d7e07a2":"8094","898fbce6":"8119","89e2a034":"8500","09873bbf":"8603",ccdb7d8e:"8671",dc1ffe41:"8765","549d4813":"8937","20c26c09":"9043","7b75dda3":"9291",aa9e0a32:"9445",adcafac5:"9460","1be78505":"9514","77aefabb":"9529","14eb3368":"9817","151c6df9":"9910"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,3312:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|3312)$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({48:"5e990467",53:"935f2afb",98:"ea1c4d9c",198:"cd7c2d77",234:"960820ba",312:"65738dd0",338:"fcf2ab4a",532:"796a85a4",684:"9077fac8",725:"25d8b80d",772:"83c81510",1287:"0db50651",1308:"233592aa",1334:"0b3f8f9e",1340:"088722c1",1612:"1168fff2",1616:"053f75fc",1645:"a9921181",1720:"058088ab",1769:"db294877",1815:"5e02abc9",1817:"653a7c45",1843:"a50f1aae",1863:"5769b8b8",1912:"7a340eac",2015:"b00bba07",2099:"569ca1c3",2313:"80be2a8a",2402:"ea5fa6de",2416:"5f08b4f2",2515:"1a681764",2568:"2e4ae8aa",2661:"c0701f9f",3031:"d111c479",3085:"1f391b9e",3104:"413a666c",3105:"22246754",3122:"733abea7",3126:"cb209646",3217:"6d200c2d",3235:"da6f36cd",3237:"1df93b7f",3263:"65c8fd9c",3280:"ef42b41f",3410:"8551d1ce",3450:"6580f360",3550:"56ea20cd",3590:"23e706d0",3692:"c8df9c33",3789:"36808404",3944:"cb437ed4",4123:"3486f30c",4271:"e14761ab",4373:"3a0bcb29",4489:"40112e03",4495:"7cec3784",4527:"bd17806f",4583:"4905fc56",5369:"43bcd13d",5387:"453504d6",5497:"f24868ee",5649:"abb3262a",5812:"03df22dd",5860:"e638209b",5985:"97f5f12b",6346:"41aaf8c0",6389:"58fb9b16",6517:"7a8c1c24",6863:"52c99585",6891:"86d9053f",7004:"562ee734",7201:"e591c1cc",7315:"bcceb52c",7370:"c09f4ff7",7414:"393be207",7656:"74f7db9b",7808:"ea18547f",7841:"0c7ae786",7884:"b8944823",7918:"17896441",7975:"36ae4492",8047:"01abbd2a",8082:"a6f71905",8094:"0d7e07a2",8119:"898fbce6",8500:"89e2a034",8603:"09873bbf",8671:"ccdb7d8e",8765:"dc1ffe41",8937:"549d4813",9043:"20c26c09",9291:"7b75dda3",9445:"aa9e0a32",9460:"adcafac5",9514:"1be78505",9529:"77aefabb",9817:"14eb3368",9910:"151c6df9"}[e]||e)+"."+{48:"d28a1ada",53:"3c26d6d5",98:"d5e2df55",198:"19a2c5ce",234:"5fbd001c",312:"f3582eb5",338:"27c25ea9",532:"dea22f76",684:"8e0ca2aa",725:"e85f2954",772:"3c430e85",814:"dc8c3a26",1287:"22702492",1308:"9dcff324",1334:"155dc01f",1340:"203ba318",1612:"27ae7cc2",1616:"48651b26",1645:"d4080e75",1720:"500fde84",1769:"0a45a9a4",1815:"66c97969",1817:"7516471f",1843:"6f21935e",1863:"0c866061",1912:"7f1c8dcf",2015:"0a966836",2099:"333f2df3",2313:"0582966e",2402:"1b057467",2416:"646f9038",2515:"b867aa98",2568:"023bce16",2661:"3890bce0",3031:"7b3bbb06",3085:"3a447380",3104:"d1f8b721",3105:"086c4b00",3122:"8d809a53",3126:"faf3bf01",3203:"c0b8bfe8",3217:"9360f8ac",3235:"4cee896d",3237:"b8ec0c1b",3263:"1b2d1390",3280:"a28d7ef7",3410:"4465f085",3450:"03e766b6",3473:"fdffa07c",3550:"27b2533d",3590:"e743546e",3692:"812bc23e",3789:"e1b39532",3944:"f24544af",4123:"6768d5ac",4271:"c5946c61",4373:"5f4e1b45",4489:"39612770",4495:"5adfe37c",4527:"3c6f1908",4583:"d8eb0249",4972:"4a54fd4a",5369:"0778c062",5387:"11b40fd0",5497:"80f85594",5649:"63d60f8a",5812:"dbc88aa8",5860:"2e18361d",5985:"c1347759",6346:"ebc2cb5b",6389:"e4d80392",6517:"e42e9035",6863:"2e7784b8",6891:"b1f851de",7004:"884768fd",7201:"c1975ab9",7315:"c548d309",7370:"a8a58a29",7414:"f3c97f9b",7656:"64d152f1",7808:"d50d035b",7841:"680a1c78",7884:"f65f2baf",7918:"e3da5265",7975:"f4e88ac1",8047:"0ee72287",8082:"83439022",8094:"0c50d1c9",8119:"e1f470f6",8500:"f9a7ffeb",8603:"5f0efd6e",8671:"82171d3b",8765:"917030b2",8937:"6b37b55e",9043:"548a228a",9291:"279eec91",9445:"6c54c7ab",9460:"22d0e253",9514:"478c02c6",9529:"0284fea7",9817:"b7ea7ab7",9910:"88c50f11"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="portal:",r.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",22246754:"3105",36808404:"3789","5e990467":"48","935f2afb":"53",ea1c4d9c:"98",cd7c2d77:"198","960820ba":"234","65738dd0":"312",fcf2ab4a:"338","796a85a4":"532","9077fac8":"684","25d8b80d":"725","83c81510":"772","0db50651":"1287","233592aa":"1308","0b3f8f9e":"1334","088722c1":"1340","1168fff2":"1612","053f75fc":"1616",a9921181:"1645","058088ab":"1720",db294877:"1769","5e02abc9":"1815","653a7c45":"1817",a50f1aae:"1843","5769b8b8":"1863","7a340eac":"1912",b00bba07:"2015","569ca1c3":"2099","80be2a8a":"2313",ea5fa6de:"2402","5f08b4f2":"2416","1a681764":"2515","2e4ae8aa":"2568",c0701f9f:"2661",d111c479:"3031","1f391b9e":"3085","413a666c":"3104","733abea7":"3122",cb209646:"3126","6d200c2d":"3217",da6f36cd:"3235","1df93b7f":"3237","65c8fd9c":"3263",ef42b41f:"3280","8551d1ce":"3410","6580f360":"3450","56ea20cd":"3550","23e706d0":"3590",c8df9c33:"3692",cb437ed4:"3944","3486f30c":"4123",e14761ab:"4271","3a0bcb29":"4373","40112e03":"4489","7cec3784":"4495",bd17806f:"4527","4905fc56":"4583","43bcd13d":"5369","453504d6":"5387",f24868ee:"5497",abb3262a:"5649","03df22dd":"5812",e638209b:"5860","97f5f12b":"5985","41aaf8c0":"6346","58fb9b16":"6389","7a8c1c24":"6517","52c99585":"6863","86d9053f":"6891","562ee734":"7004",e591c1cc:"7201",bcceb52c:"7315",c09f4ff7:"7370","393be207":"7414","74f7db9b":"7656",ea18547f:"7808","0c7ae786":"7841",b8944823:"7884","36ae4492":"7975","01abbd2a":"8047",a6f71905:"8082","0d7e07a2":"8094","898fbce6":"8119","89e2a034":"8500","09873bbf":"8603",ccdb7d8e:"8671",dc1ffe41:"8765","549d4813":"8937","20c26c09":"9043","7b75dda3":"9291",aa9e0a32:"9445",adcafac5:"9460","1be78505":"9514","77aefabb":"9529","14eb3368":"9817","151c6df9":"9910"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,3312:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|3312)$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n - + - + \ No newline at end of file diff --git a/bn/assets/js/0a794094.2c003c9c.js b/bn/assets/js/0a794094.2c003c9c.js deleted file mode 100644 index 8aec1d1926d..00000000000 --- a/bn/assets/js/0a794094.2c003c9c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[3114],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8312:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/bn/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/bn/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/bn/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/bn/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/bn/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/bn/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/bn/assets/js/0a794094.88066c9d.js b/bn/assets/js/0a794094.88066c9d.js new file mode 100644 index 00000000000..e2e2fa28466 --- /dev/null +++ b/bn/assets/js/0a794094.88066c9d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[3114],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8312:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/bn/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/bn/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/bn/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/bn/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/bn/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/bn/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/bn/assets/js/5b971fb4.07be10b1.js b/bn/assets/js/5b971fb4.07be10b1.js new file mode 100644 index 00000000000..6c028456134 --- /dev/null +++ b/bn/assets/js/5b971fb4.07be10b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2702],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5927:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/bn/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/bn/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/bn/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/bn/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/bn/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/bn/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZEAAABOCAYAAADhPisZAAAK0mlDQ1BJQ0MgUHJvZmlsZQAASImVlwdUU9kWhs+96SGhJICAlNB7bwGkhB5AeheVkAQSSowJQcSuDI7gWFARAWVAB0EUHB2K2BBRLAwCFuwTZBBRn4MFGyrvAo8wM2+999bba52cb+3ss8/eZ91z138BIPuyhMJMWBGALEG2KDLAmxafkEjDjQACoABloA+sWWyxkBEeHgIQm53/au/vAGhqvmk5levf//+vRuFwxWwAoCSEUzhidhbC7ch4yhaKsgFA1SJ+/RXZwinuRlhZhBSIsHSK02b43RSnTDMaPx0THemDsCYAeBKLJUoDgGSC+Gk57DQkDykQYRsBhy9AOBdhDzaPxUG4FWGLrKxlU/w7wiZIvBAAMglhesqfcqb9JX+KLD+LlSbjmb6mDe/LFwszWSv/z6P535aVKZndwwgZJJ4oMBKZ5ZHzu5uxLFjGgpTQsFnmc6bjp5knCYyZZbbYJ3GWOSzfYNnazNCQWU7l+zNlebKZ0bPMFftFzbJoWaRsr1SRD2OWWaK5fSUZMTI/j8uU5c/jRcfNcg4/NnSWxRlRwXMxPjK/SBIpq58rCPCe29df1nuW+E/98pmytdm86EBZ76y5+rkCxlxOcbysNg7X128uJkYWL8z2lu0lzAyXxXMzA2R+cU6UbG028nDOrQ2XnWE6Kyh8lkEgCAc0YAccABcg9Wdzc7OnmvBZJlwp4qfxsmkM5KZxaUwB28qCZmdjZw/A1L2deRTe3pi+j5BaypyPi2Sx70ScjDkf/wUAp6uQK6g45zNGHlLFcgDOP2RLRDkzPvTUDwYQgQLyRlAH2shbwQRYItU5ATfgBfxAEAgD0SABLAFswANZQARWgNVgAygARWAH2APKQCU4CGrBMXACtIAz4AK4DK6DXnAbPABSMAxegDHwHkxAEISDyBAVUod0IEPIHLKD6JAH5AeFQJFQApQMpUECSAKthjZBRVAxVAZVQXXQz9Ap6AJ0FeqD7kGD0Cj0BvoMo2ASrAxrwUawNUyHGXAwHA0vhtPg5XAenA9vg0vhavgo3AxfgK/Dt2Ep/AIeRwGUHEoVpYuyRNFRPqgwVCIqFSVCrUUVokpQ1agGVBuqC3UTJUW9RH1CY9FUNA1tiXZDB6Jj0Gz0cvRa9FZ0GboW3YzuRN9ED6LH0N8wZIwmxhzjimFi4jFpmBWYAkwJpgbThLmEuY0ZxrzHYrGqWGOsMzYQm4BNx67CbsXuxzZi27F92CHsOA6HU8eZ49xxYTgWLhtXgNuHO4o7j+vHDeM+4uXwOng7vD8+ES/Ab8SX4I/gz+H78SP4CYIiwZDgSggjcAgrCdsJhwhthBuEYcIEUYloTHQnRhPTiRuIpcQG4iXiQ+JbOTk5PTkXuQg5vtx6uVK543JX5AblPpEoJDOSDymJJCFtIx0mtZPukd6SyWQjshc5kZxN3kauI18kPyZ/lKfKW8kz5Tny6+TL5Zvl++VfKRAUDBUYCksU8hRKFE4q3FB4qUhQNFL0UWQprlUsVzylOKA4rkRVslUKU8pS2qp0ROmq0jMKjmJE8aNwKPmUg5SLlCEqiqpP9aGyqZuoh6iXqMPKWGVjZaZyunKR8jHlHuUxFYqKg0qsSq5KucpZFakqStVIlamaqbpd9YTqHdXP87TmMeZx522Z1zCvf94HtflqXmpctUK1RrXbap/Vaep+6hnqO9Vb1B9poDXMNCI0Vmgc0Lik8XK+8ny3+ez5hfNPzL+vCWuaaUZqrtI8qNmtOa6lrRWgJdTap3VR66W2qraXdrr2bu1z2qM6VB0PHb7Obp3zOs9pKjQGLZNWSuukjelq6gbqSnSrdHt0J/SM9WL0Nuo16j3SJ+rT9VP1d+t36I8Z6BgsNFhtUG9w35BgSDfkGe417DL8YGRsFGe02ajF6JmxmjHTOM+43vihCdnE02S5SbXJLVOsKd00w3S/aa8ZbOZoxjMrN7thDps7mfPN95v3WWAsXCwEFtUWA5YkS4ZljmW95aCVqlWI1UarFqtX1gbWidY7rbusv9k42mTaHLJ5YEuxDbLdaNtm+8bOzI5tV253y55s72+/zr7V/rWDuQPX4YDDXUeq40LHzY4djl+dnJ1ETg1Oo84GzsnOFc4DdGV6OH0r/YoLxsXbZZ3LGZdPrk6u2a4nXP9ws3TLcDvi9myB8QLugkMLhtz13FnuVe5SD5pHssePHlJPXU+WZ7XnEy99L45XjdcIw5SRzjjKeOVt4y3ybvL+4OPqs8an3RflG+Bb6NvjR/GL8Svze+yv55/mX+8/FuAYsCqgPRATGBy4M3CAqcVkM+uYY0HOQWuCOoNJwVHBZcFPQsxCRCFtC+GFQQt3LXwYahgqCG0JA2HMsF1hj8KNw5eHn47ARoRHlEc8jbSNXB3ZFUWNWhp1JOp9tHf09ugHMSYxkpiOWIXYpNi62A9xvnHFcdJ46/g18dcTNBL4Ca2JuMTYxJrE8UV+i/YsGk5yTCpIurPYeHHu4qtLNJZkLjm7VGEpa+nJZExyXPKR5C+sMFY1azyFmVKRMsb2Ye9lv+B4cXZzRrnu3GLuSKp7anHqszT3tF1pozxPXgnvJd+HX8Z/nR6YXpn+ISMs43DGZGZcZmMWPis565SAIsgQdC7TXpa7rE9oLiwQSpe7Lt+zfEwULKoRQ+LF4tZsZUQgdUtMJN9JBnM8cspzPq6IXXEyVylXkNu90mzllpUjef55P61Cr2Kv6litu3rD6sE1jDVVa6G1KWs71umvy183vD5gfe0G4oaMDb9utNlYvPHdprhNbfla+evzh74L+K6+QL5AVDCw2W1z5ffo7/nf92yx37Jvy7dCTuG1IpuikqIvW9lbr/1g+0PpD5PbUrf1bHfafmAHdodgx52dnjtri5WK84qHdi3c1bybtrtw97s9S/dcLXEoqdxL3CvZKy0NKW3dZ7Bvx74vZbyy2+Xe5Y0VmhVbKj7s5+zvP+B1oKFSq7Ko8vOP/B/vVgVUNVcbVZccxB7MOfj0UOyhrp/oP9XVaNQU1Xw9LDgsrY2s7axzrqs7onlkez1cL6kfPZp0tPeY77HWBsuGqkbVxqLj4Ljk+POfk3++cyL4RMdJ+smGXwx/qWiiNhU2Q80rm8daeC3S1oTWvlNBpzra3NqaTludPnxG90z5WZWz288Rz+Wfmzyfd368Xdj+8kLahaGOpR0PLsZfvNUZ0dlzKfjSlcv+ly92MbrOX3G/cuaq69VT1+jXWq47XW/uduxu+tXx16Yep57mG843Wntdetv6FvSd6/fsv3DT9+blW8xb12+H3u67E3Pn7kDSgPQu5+6ze5n3Xt/PuT/xYP1DzMPCR4qPSh5rPq7+zfS3RqmT9Oyg72D3k6gnD4bYQy9+F//+ZTj/KflpyYjOSN0zu2dnRv1He58vej78Qvhi4mXBP5T+UfHK5NUvf3j90T0WPzb8WvR68s3Wt+pvD79zeNcxHj7++H3W+4kPhR/VP9Z+on/q+hz3eWRixRfcl9Kvpl/bvgV/eziZNTkpZIlY01IAhQw4NRWAN4cRXZwAALUXAOKiGV09bdDMt8A0gf/EM9p72pwAqGkHIBbBKVlUMaVBkKGwHoApOYTII9jeXjb+ZeJUe7uZXCQNRJq0T06+mQQAlwzA157JyYnSycmvJTPfBedDZ/T8lOmNIRpoSudAA6NbwN9tRuv/qce/z0BWwV/mfwJHChVbDtPk/gAAAGJlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA5KGAAcAAAASAAAAUKACAAQAAAABAAABkaADAAQAAAABAAAATgAAAABBU0NJSQAAAFNjcmVlbnNob3Tg3lotAAACPGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+Nzg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NDAxPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Ct+LN4UAABcMSURBVHgB7Z0JmBRFlscf0NDcIDR3NyDQXM0h54LIjRxyiKLsKCAqOg4znrMz4+zst7uzuuuuOqijszMCyiGHct80pxwKtFxCt9wsct+nzdU0yMY/iiiStKsqO6uqO2v4v/66KiszMiLyly/ixXsRWVXgUuaFm0IhARIgARIgARcECro4h6eQAAmQAAmQgCZAI0JFIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE0gzvWZPJEE7lICxVs0ukuvnJf990bg8qbvwr4keiJhI2QGJEACJHD3EqAncvfee155mAQiMYoLswo8nQRcEYikN01PxNUt4EkkQAIkQAIgQCNCPSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkENO/J7J9/RHJSDsk+7adlBOHLsjFC1n6jpYsEy+VkspIrZSK0rhNkjRsXY13mgQ8RYC666nbwcqEQaDApcwLN8M4P19OXTFzuyybuk2OHzjvqPzKNcpKt4Ep0vnRho7SMxEJBCNgftDHzY9SUXeDkeWxvCIQjg7b6xhTRuTAztMy+b21sjfjhP06HH2u07iSPPnr+6VG/QRH6ZmIBHIi4KYBUndzIsl9+UXAjQ4HqmvMzImsX7ZP3hw227UBAQAYH+SBvCgkkFcEqLt5RZrl5AeBmJgTQSMc+a/LI8Ln5o83/Xm17lYrInkyExIIRIC6G4gM9/+9EPC8J4IwwKh//zLivJEn8qaQQLQIUHejRZb5eomA540I5kDgPURakCfyppBAtAhQd6NFlvl6iYCnjQhWsridRE9uUlnwH0yQN8qgkECkCVB3I02U+XmVgKfnRLCM16289HYv/6mpk7bI3vRjsif9uH+f2UAZXPpraPA9UgSou5EiyXy8TsCznggexnL6HAgg270OGA7z32vQfdJrULMc7wXKQFlO5NKlS3LgwAG5fPmyk+T+NFeuXJEVK1fKxYsX/fvC3di0+VvZsnWr42xu3rwpN278mGP6GzduCI6HKwcPHZKlyyKzAMJtXdZv2CD71T3KT/Gi7l67dk1wf86dO5drNGvXrpPDh521ESeZ51ZPoLfQ0Zz/c9ZpJ/XwSprc8vBKvU09POuJ4El0p9JrcDNlJO7zGY2J3+rTUm+940Ny48pSJ0hoC2UFe6r9h8xMGTtuvJw8edJfpSpVqsjTTw2RkiVL+vcF2oDxWLb8S6mbXNdR+kD5WPcvV/kVLFRQ7mvaVO9e/dXXUq9uXalUqaI1mX97+oxZsn//9/Lb3/yTf5/Z+Lc//of0fughub9tG7PL1fvGjZtk0+bN8kC7+6VYsWKu8gj3JHBuft99UrNGjXCzcn2+l3QXHe+MmbNka3q6/3qKxheVoUOHSPWkJP++YBuLly6Vzp06SWJiZL75wa4nBw4elBMnTkjrVq1yrMYf33hDfvwxZ2NRtkyZHHU6x4w8sjM9PUPii8br9ooq2Xl4pJqOq+FZI4KvMnEqMBIQGBKI1YDoHSFeQpUFA5J1NUuefXqo6qQrydGjx2T6zJkyRu1/+cVfhcg9OodfevGX/ozhRSxeskSKKsUMZET8iaO48XC/vtK1a5d8MyBRvLRcZR1Kn6yZRVt3Fy9ZKhnffScDHn1U6tSuJZmZF2VhaqqM/uRT+cPvX8+Xe2XXk+3bdwg8yEBG5Llnn5Ebt4zI9OkzpVSpktKjR3eNMb5IvBVnTGyvXL1aypcr5zcidh4xcRGWSnrWiOC7sAIJPA/T+JDG6mW4MSTBysIICB5Ixw4dpHbt2rpKdesmy/AXfi5Hjx3Tn/9v3z6ZPPkLef13v5EiRYrofWlp30jaN+vl1Vde0p/xcuToEZk6bbqcPXdWqlWtKr169pAat0bMkz+fohp0UR3y2r1nj5QuVUoGDxok6RkZsnbdOilYsKC0aN5c+vR+SOc3b/4CKVy4sLR/oJ387eNR/n1Lly6Xf/nD7/VnNy+oR/HixQQhuJ27dklcoTjp1KmjLgf5wWClLlos3367Ra5mXZUqlSvL4489JhUqJGgvZM2adfLaqy/roo8dOy4LFi4UjDRLlSylr3f2nLky9KnBUr16dQlVFjJZB47q//yF89q7gMdUsWIFnT9CNDNnzZZdu3frz926dNHv+f0STJ/yUnfBYZ/STQx8mjfzDbBKly6t+A+RPXv36tH99evX5e13/iQDHx8gycnJGt3x48eVkRkjGKiULVtW70MId8zYcfL9/v1yj9rX/oEHpFWrlvrY2nVpsnHTJmmU0lC++nqN3tevbx+tn3PmzNN6UkPd7yGDB0l8fPwdegIvCWFZtLM3//OtO3RNZ6ReTBvB56KqjeAaat17rzms9QgDqAs//KCvd9ATT0i9enUF3vr6jRu1Lpe7p5w80v9hqVnT56G+9T9vS/t27WSral/wgqCfAwY8IrVr1dL5gsH0GTPlhGr78NzatGktXW/pF9rGrNlzFcM9ut5oy0/87B+VcSulzz1/4YLMmzdf9n3/vW4/dVWE4JH+/SQuLk7ee/8DOXP2rC4T1wuPEGVZ2w3Cd/Pmz5edO3dJ1rUsrfd9+/SWcsrwQELVXSfKwxfPzomYL1PMiQUMBQyH+benwXH7HIk9jfVzsLLQeVesWFE1jq9ljYoNY14Ecs8990hKw4Z6+1rWNd1QrC73latXlFLfaQjnzJ2nDFEt6d2rlxoRZmpPBqEyyAXVSaIhQtH69e0rV5Xn89ePP5atW9OV4eitRy3r0tJ04/elvyA/qEYDxe3Tx2dYGjdu7DcyOlMXL6jHBtXwrmZlyUM9e6rrLCuLFi+WLPUZAsO4Zu1a6dSxgzIeAzSPcePH62OXL1/RnT0+oNP55NMxcvLUKWU8ekrTpk1k6vTpmlN2drZOH6osdC7zFyxQnUh1ncfp06f1CPrq1av6/M+/mKJH2fe3bStdOneWL1es9N8fnSCfXoLpU17qLi6/luoUj6nBDnTv1Cnfc1EY6EB3S5QooTvBy1cuq87qmp9WdvZ1fZ+uX7/h34d7jgFEvz59pIwKIc2eqzpRNdiB4F6jI874bpsOi1ZISNAd8LTpM7SedFaDEBgf3B9f+tt60rJFc7m3Zk09SOrbt7cK+foMmU7o8AV6hDBqltKLXj16aKO5adNmWbFqlTRRbQIdMOTTsWP984Jox4uU9w5j1L1bN4FOzp0731/iyNGfiBQoIDBIzZs303X/Tl0fBAOhHTt3aKMCw3JMGYFJkz/XxzCwGa3O3b//gGBQ00JdX3pGukyZOk0f7979Qc0dfQquFx6Jtd0g0TTVTtAGce6DXbuqwedRGTX6U38bDFV3XVAevnjWEwmXQZ0mVXJcjeUmX4zcxowZq8MACAWUKV1GWrduqWL/7XSn7zTPli1aKAPRRydv0KC+vPOnEZKh4qPt1BwCBPFdjGggaLBzVEMdPOhJqVq1iqCxISxx5MhRSa5TR6fBC0Z2mBfBqKmm6mzRWYcr6Fww31NANSKM6N4d8Z5qNDt1OYcOH741MvsHKVSokG6EMBR22blrt+6IXvvFK5KQUF4fRr6pixbdkTRYWZjfaNiggTz6SH99TsOGDdSo+V3ZvXuP1KlTW+CxwUBhDgZSo3qS6MavP8XuSyR1t4fqtM6cOaPDRQgZwYA0b9ZMOnRor/S4tGNIGDQ9+8zTWifQuY147335Wg2qjPeCjJ4f9qzyYosrnagpI9SIG4bd6Dbu2WGlO3aBl4H5ReiVmd+zp3HyGZ7ECz9/XtcP6eFxDH/hBf88DryxUapzh0FNTPTN7cDAPNSrp84ec3iz5swRDOoKKr2HMWipPP/69evp/xTlZaEMCNr9g8rwGL3Ozr4mK1et1sfg4cETefGXw/V1YScMxrZtPgPUKCVFGyQYj5yuF4M1tHMM4Ay75OQ68sGHH2m9b9y4kS4nUN0Rwchr8awRwde5Z57zjTjtULDqKlA4C2n1qizLxLr9fPtnlBVM0Ln/+rVXtQKiM12/fqNehbRLdZRQXKcCw2EEozk0TIwyjFRVbrGREiWK602jqOjQ4VYj/BBtSaxWzd8YEc6Ad3T2rG9VTxOlxFuVh/DWf78taFhQaqtRM3U7cuSIrq+pP/bXr1fvJ0YkUFnw6rCSCP9mlGfyPqzyLlGyhP5YXxk5IwiRwXPMb/GS7sLQI4yEUM+2bdv1vUv75hvZsmWr0ulXdMjJCS/cO+ggBIwRotm2/fYzVjBOMCAQDAwgFSv4wo7YhscMzzlaAsNg6ocyEpQ3hA59/oKFqtxMFXr2tTN0+EagL0bM9vnz5/WCA3T885QXjAUJDdRABuHAkiV9i2jQTuElr/7qK+2FoU8wcvjQYd1eYBiN4FwTTjT7Ar2b/gCDNyMVFEe0fRhaY0RMfZHGbKPuNCKGmnrH74EENCLKQKRa0r6sngkx8yK5NSDIBmU5ESgG/jHCmqYm+LZs3aIbpzkX3oMRy6bZ9ZMGizmN7GxfaMefKEobhQvH6RCZPXsTpoKhMIKOxyrWjhmdCUZZ36zfINt37NBhBKyEev65YdZT1CS/Mng37jR4pixrwkBlGWOJxmNizTgPMeukpEQ/N2u9cdxaV3zOD/Gi7sLrwOo7/KMDRKgJ3mLjRik+RLdVV26qP7vYOdt1t2CB/DXeVgOCusOLxbL6CgkVVCebJBis2Jc3x1n03K43mPMEp3QVKcCiFfw/P2yY9nBGjR4tGMhA72FsYDRNmDtbDfIwj+hWsq/5+gM770Jxhfw6j7yD1d1t2W7Py987H6TW+EGp3IobA4IygpV1/PgJeefdET9ZJ5+c7Jtk/1FNghWJL6Krag3rnFYhBLvsV3FhI3CXEeO3eh/mmNt3awzbngdGK5gIP3Pm7B2HMFqDOF3uiUnF8uXLS/+H++nVPZ07dtTPZcCFtwo6ehgC69LSlSpG7VQwskXjRHgOIUDz/5iah8FSZjPSw6S9kXPnzueJp2bKC/QeTJ8CnRMN3cWg5v0PPhQ852GVOrcWiNxU3p7prE6cvP3zCmfVxK9drLqLY/iMRRWREut8YiTyROgOAx4sbEE4tPWtRQBO8sbENgZ3WC32nArRYRUb9BEeXKYKd8GA9FXzlBg4Pdyvr7RQ4UEj0Hu0M3h+RhCCxhJ8q5hBknUftqtV80UjDh485D+EOScYKRhCL4p7kxnlq8EvEi75PMNRKR++nqon0q1PpMM7MQIvBY00kKCsQIIlsxhBT5w0Wa/uwMgDDW7BglTdyWHiuUiRwvr0pUuXSU81sXfm7BkdNoDiWQUTi1hhkVA+QYXDlulJzRQV5w9XMAorXqy4ClFs0cbAxHyt+dZVcVV0GB+PHKUbFVxkPOQ0a/ZsPcdTuXIla/KA25jMhlv99NCndDjulDKEGMWVuuXqmxPRgDFpidVoq1Yrt//SZf2wmDnu5B2xeyxoAHPkBc8H3DBvhNgyRpmY5MQyz3hlyOdYJkad5B+tNF7RXegFwompamFEnPJ6scQXk7hYrABJVqsMce8wx7dhwyZJSkzSneXC1DvnrZAW93zR4iXKc2nkm5tTYdj+/frhUNiCsBc61c1qxV89VScTDgsnY4R1UGc8JAmPeOq0GY6zO3XqpHz0v3+Vtm3aSPv2D8gZpeOoH1YFmuefdqiVi7Vq3atWVp1Qc0Nr/XnDQKPdjxv/mTYweDQAbQDndlB5QXC9WFGIVZ1JiYn+c7GBkBkGSJifgbeHlZK4H2i7uF9eFM8aETz8h18kdPrUutWAYGWWCW8B+l71dSeBnh1BGcEeNERD/IVybSdMnCifqX8jmBh7Rj03AoHS9+zeXZaoDu5vI0fq+GWD+vW1kpj0eO+kRu3o9KCQCNMMfPwx3UHimN0dx76cRFVHiz19586d9HwDyv+vN9/4yalQzl8NHy7jP/tMJk6e7D+O5YlYOGDEnu/t/b4teCATlEHFJCUE1zH4ySf1JLupmy+lyFNDBuu4+b59399azdZA/vzRX8zhgNds8umpngXAKAzLhDFSRYfXtUtnbUCQybPPDJVxn01Q9Zmk82zVsqVgpZHK2F9Gfmx4RXdx7dCxL6ZM1Ys0DAt0chgEmIl1pBmrVtiNnzBBJ8ECEKwUtOoClpcjtAOjjvuADtYs8XWK2+RnT4+5tVXq2YkZ6tmrDmrpsHkGxNQ31LvJ15qun/IQxo+foNsj9mM571dr1gTUDZNHASkglZWH9WC3rrL8yxVqiXmazhYLPMxCGqxQm690EroMlpgg3/yt7yFn9AUIe30xZYpeSYiTYRR+dmvBDD63VSHFPXv26iXTw57BYgXsvS3YN2HiJH87xdwp9gWa77DW/XYuebfl6V82xJfYTXxX3fgoyuDftnP83VkI5WCCuXz5cjrmb68WwgdwO80EnP04PiMNOsZIjLbs+SNvPKFsQhT24+YzPCuELOCNhEprzrG/IxyHsszIzH4c8Wd4XuhoTKhsxcpVKla9XP759d8FZWTPC5/x1D+YmQZjTYPrwX6752dNE8ltJ78K5zXdxcDl1KnTimFx/ZxFTjzAuJjyaAsVKpjTYb0P+o0J9JzuQ8CTHB5ACAn6GMm8UV/Mz9nn3hxWSesdrheG0ypO2jr0EufBo8hJcL2BjiE92hfuG1ZgRlqc6LDTMj3rieAC8MWIaYv2uv4m31AQ8HO5ufnyRXSY1aoF/joPKH8wA4L6IE00DIjJ24lRgFKaOYVQjAIdD9VhY1UXvmcMk5NV1UgsM/Oifm6mqRq1hWKUU5nBzolGI8upDrnZ5zXdhV5UqRJ8DiMYY3Pt0dJd5B+sQzXl5/Y93PoGYuKkrYfSy1DXC8Pn1vjlllM46e80r+HkFKVz8ZvoBQra/L0IlIU8kTclOgTQyF55+WV5WD04majivk2bNNZLTQeqifG7Rai7d8udvruv09PhLHNrIvkToybPF97sKvx5XEOD77khkJtQAHU3N2SZNq8I5EaHQ9XJ854ILgCdPTr9SHgkyIMGJJRa8HikCFB3I0WS+XiVgKfnRKzQ0BgrJZbWP2nr9tcOMQeCEEON+gnWrLlNAlElQN2NKl5mns8EYiKcZWeElS/45Tiny3+xjLfbwJRcTaLby+RnEjAEwgkFUHcNRb7nJ4FwdNhe75g0IuYi8Aty+AEg/H4Dvn7bfHsqvrsIXz2BJ4fx4Few50BMXnwnAacEItEAqbtOaTNdNAhEQodNvWLaiJiL4DsJ5CWBSDbAvKw3yyIBQyCSOhwTE+vmwvlOAiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRYBGJKZuFytLAiRAAt4iQCPirfvB2pAACZBATBGgEYmp28XKkgAJkIC3CNCIeOt+sDYkQAIkEFMEaERi6naxsiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRSBmfk8kpqiysncFAfMldnfFxfIiSSAAAXoiAcBwNwmQAAmQQGgC/Cr40IyYggRIgARIIAABeiIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgCNCKhGTEFCZAACZBAAAI0IgHAcDcJkAAJkEBoAjQioRkxBQmQAAmQQAACNCIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgC/w/zX0lg9vhbHgAAAABJRU5ErkJggg=="},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/bn/assets/js/5b971fb4.ae49f9aa.js b/bn/assets/js/5b971fb4.ae49f9aa.js deleted file mode 100644 index 917410b0976..00000000000 --- a/bn/assets/js/5b971fb4.ae49f9aa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2702],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5927:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/bn/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/bn/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/bn/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/bn/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/bn/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/bn/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/bn/assets/js/runtime~main.4726b08a.js b/bn/assets/js/runtime~main.3cf03c8e.js similarity index 98% rename from bn/assets/js/runtime~main.4726b08a.js rename to bn/assets/js/runtime~main.3cf03c8e.js index 80c6271ad01..92af10aeb7a 100644 --- a/bn/assets/js/runtime~main.4726b08a.js +++ b/bn/assets/js/runtime~main.3cf03c8e.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,b,c,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(a,f,b,c)=>{if(!f){var d=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,b,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&b&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(c,d),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({26:"341e437f",53:"935f2afb",498:"b230cef3",540:"ea817fa8",664:"e2a9a44d",669:"75d09e6a",854:"11f97726",877:"30e80b05",1426:"b1286164",1517:"88073ef8",1644:"8abbe93c",1686:"0e355509",1840:"15a0f153",1960:"9d2fc2dc",1976:"706c7c98",2236:"35145f99",2702:"5b971fb4",2750:"eabae628",3060:"437352a3",3076:"32d127ed",3085:"1f391b9e",3114:"0a794094",3136:"43ebd341",3184:"fff47811",3205:"fe910c09",3212:"2cdfdd8c",3235:"da6f36cd",3237:"1df93b7f",3256:"1f6b440c",3280:"ef42b41f",3722:"a3d57757",3748:"8c29294b",3752:"4595f990",3823:"0b49db57",3838:"408c56b8",3856:"c362cb1a",3869:"4dcf1dd4",3909:"ffa37b6f",3923:"08148a3c",3930:"ef1d8f5a",3963:"38669cdd",4069:"d2751ef1",4107:"75a6457a",4271:"5c3cdee1",4364:"a1560acb",4462:"cd945b23",4485:"342acbb2",4838:"0a77735a",4856:"62dca701",4871:"32cdcb85",5003:"efe308d1",5057:"9cd3fc89",5158:"49e497f9",5362:"c06dc13b",5562:"617ef373",5619:"4ed4c6d6",5699:"82be2c50",5728:"a5412652",5941:"3292a6e1",6026:"f0bc2ce1",6355:"0cbe556c",6387:"88bd40d1",6390:"975b026c",6729:"aa39a537",6777:"f7df798f",6827:"65ecfad5",6846:"a55f4ed6",6871:"0f86cb27",6933:"2d63a99b",7069:"1216a57d",7084:"9c184385",7090:"5bb53b34",7115:"74e6d608",7299:"ee1f7f2b",7370:"c09f4ff7",7414:"393be207",7515:"2e885ed0",7605:"dbfb85ee",7918:"17896441",7938:"198f37a8",8028:"32469a1b",8316:"811b7d78",8510:"4848325b",8592:"4827a2b4",8677:"7c854a6c",8929:"649a09e3",8949:"e8f18b53",9056:"c74b6c35",9144:"b2d410b4",9266:"2007f370",9405:"b46f25af",9514:"1be78505",9568:"58a9f2a8",9817:"14eb3368",9873:"6a82b540",9886:"f6563dcc",9949:"09271f0e",9977:"4b4ab30a"}[e]||e)+"."+{26:"c222073b",53:"64183bfb",498:"cc2869ef",540:"31d6fa01",664:"c5a748a4",669:"f6bb707c",814:"dc8c3a26",854:"318c7073",877:"c0663dda",1426:"567678eb",1517:"35b759b0",1644:"997caf2c",1686:"f210cc05",1840:"f186acec",1960:"055cc1fb",1976:"898ccb45",2236:"4429510b",2702:"ae49f9aa",2750:"1abeeb2c",3060:"caa5a8ea",3076:"0e1700a2",3085:"3a447380",3114:"2c003c9c",3136:"7664a094",3184:"84890b1a",3203:"c0b8bfe8",3205:"79c66d4f",3212:"45747821",3235:"4cee896d",3237:"b8ec0c1b",3256:"2fee3ee1",3280:"a28d7ef7",3473:"fdffa07c",3722:"04d434b4",3748:"23864c69",3752:"97183597",3823:"9152a61f",3838:"feb6e86a",3856:"ed8a36f2",3869:"a586a221",3909:"848ea900",3923:"099cce05",3930:"e4b34b05",3963:"d708e98b",4069:"587130c3",4107:"65675b3d",4271:"c3134dff",4364:"b42d6708",4462:"e3da8e1d",4485:"ad729856",4838:"93393495",4856:"4d0c92b3",4871:"d0631441",4972:"4a54fd4a",5003:"0c88a717",5057:"34dc4342",5158:"edf3697e",5362:"861a1b81",5562:"cea9cd6e",5619:"65331529",5699:"98ae9519",5728:"61002cc5",5941:"8d32e00c",6026:"994b59d2",6355:"aad755b2",6387:"72e2664f",6390:"cd096c5d",6729:"4ebe1a53",6777:"e6b69ad5",6827:"9d021ba0",6846:"17373c13",6871:"5a8d034f",6933:"d57f2f92",7069:"0fb0ec88",7084:"a97a46cc",7090:"b376322d",7115:"c0e20bbe",7299:"5ddc6479",7370:"a95c0d20",7414:"62b71c07",7515:"ad1db548",7605:"2b86340f",7918:"e3da5265",7938:"33342650",8028:"e91541fa",8316:"e49d0502",8510:"cfeda3c9",8592:"d352ae33",8677:"a3714765",8929:"ebcb7c32",8949:"eaf424e2",9056:"09b03c42",9144:"45aa5325",9266:"83f31c48",9405:"4a1da309",9514:"478c02c6",9568:"2524e3d3",9817:"b7ea7ab7",9873:"a157f57b",9886:"81256d6d",9949:"eb4109f1",9977:"5ccdaa81"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},c="portal:",r.l=(e,a,f,d)=>{if(b[e])b[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/bn/",r.gca=function(e){return e={17896441:"7918","341e437f":"26","935f2afb":"53",b230cef3:"498",ea817fa8:"540",e2a9a44d:"664","75d09e6a":"669","11f97726":"854","30e80b05":"877",b1286164:"1426","88073ef8":"1517","8abbe93c":"1644","0e355509":"1686","15a0f153":"1840","9d2fc2dc":"1960","706c7c98":"1976","35145f99":"2236","5b971fb4":"2702",eabae628:"2750","437352a3":"3060","32d127ed":"3076","1f391b9e":"3085","0a794094":"3114","43ebd341":"3136",fff47811:"3184",fe910c09:"3205","2cdfdd8c":"3212",da6f36cd:"3235","1df93b7f":"3237","1f6b440c":"3256",ef42b41f:"3280",a3d57757:"3722","8c29294b":"3748","4595f990":"3752","0b49db57":"3823","408c56b8":"3838",c362cb1a:"3856","4dcf1dd4":"3869",ffa37b6f:"3909","08148a3c":"3923",ef1d8f5a:"3930","38669cdd":"3963",d2751ef1:"4069","75a6457a":"4107","5c3cdee1":"4271",a1560acb:"4364",cd945b23:"4462","342acbb2":"4485","0a77735a":"4838","62dca701":"4856","32cdcb85":"4871",efe308d1:"5003","9cd3fc89":"5057","49e497f9":"5158",c06dc13b:"5362","617ef373":"5562","4ed4c6d6":"5619","82be2c50":"5699",a5412652:"5728","3292a6e1":"5941",f0bc2ce1:"6026","0cbe556c":"6355","88bd40d1":"6387","975b026c":"6390",aa39a537:"6729",f7df798f:"6777","65ecfad5":"6827",a55f4ed6:"6846","0f86cb27":"6871","2d63a99b":"6933","1216a57d":"7069","9c184385":"7084","5bb53b34":"7090","74e6d608":"7115",ee1f7f2b:"7299",c09f4ff7:"7370","393be207":"7414","2e885ed0":"7515",dbfb85ee:"7605","198f37a8":"7938","32469a1b":"8028","811b7d78":"8316","4848325b":"8510","4827a2b4":"8592","7c854a6c":"8677","649a09e3":"8929",e8f18b53:"8949",c74b6c35:"9056",b2d410b4:"9144","2007f370":"9266",b46f25af:"9405","1be78505":"9514","58a9f2a8":"9568","14eb3368":"9817","6a82b540":"9873",f6563dcc:"9886","09271f0e":"9949","4b4ab30a":"9977"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var b=r.o(e,a)?e[a]:void 0;if(0!==b)if(b)f.push(b[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>b=e[a]=[f,c]));f.push(b[2]=c);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var c=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+d+")",t.name="ChunkLoadError",t.type=c,t.request=d,b[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var b,c,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,b,c,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(a,f,b,c)=>{if(!f){var d=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,b,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&b&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(c,d),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({26:"341e437f",53:"935f2afb",498:"b230cef3",540:"ea817fa8",664:"e2a9a44d",669:"75d09e6a",854:"11f97726",877:"30e80b05",1426:"b1286164",1517:"88073ef8",1644:"8abbe93c",1686:"0e355509",1840:"15a0f153",1960:"9d2fc2dc",1976:"706c7c98",2236:"35145f99",2702:"5b971fb4",2750:"eabae628",3060:"437352a3",3076:"32d127ed",3085:"1f391b9e",3114:"0a794094",3136:"43ebd341",3184:"fff47811",3205:"fe910c09",3212:"2cdfdd8c",3235:"da6f36cd",3237:"1df93b7f",3256:"1f6b440c",3280:"ef42b41f",3722:"a3d57757",3748:"8c29294b",3752:"4595f990",3823:"0b49db57",3838:"408c56b8",3856:"c362cb1a",3869:"4dcf1dd4",3909:"ffa37b6f",3923:"08148a3c",3930:"ef1d8f5a",3963:"38669cdd",4069:"d2751ef1",4107:"75a6457a",4271:"5c3cdee1",4364:"a1560acb",4462:"cd945b23",4485:"342acbb2",4838:"0a77735a",4856:"62dca701",4871:"32cdcb85",5003:"efe308d1",5057:"9cd3fc89",5158:"49e497f9",5362:"c06dc13b",5562:"617ef373",5619:"4ed4c6d6",5699:"82be2c50",5728:"a5412652",5941:"3292a6e1",6026:"f0bc2ce1",6355:"0cbe556c",6387:"88bd40d1",6390:"975b026c",6729:"aa39a537",6777:"f7df798f",6827:"65ecfad5",6846:"a55f4ed6",6871:"0f86cb27",6933:"2d63a99b",7069:"1216a57d",7084:"9c184385",7090:"5bb53b34",7115:"74e6d608",7299:"ee1f7f2b",7370:"c09f4ff7",7414:"393be207",7515:"2e885ed0",7605:"dbfb85ee",7918:"17896441",7938:"198f37a8",8028:"32469a1b",8316:"811b7d78",8510:"4848325b",8592:"4827a2b4",8677:"7c854a6c",8929:"649a09e3",8949:"e8f18b53",9056:"c74b6c35",9144:"b2d410b4",9266:"2007f370",9405:"b46f25af",9514:"1be78505",9568:"58a9f2a8",9817:"14eb3368",9873:"6a82b540",9886:"f6563dcc",9949:"09271f0e",9977:"4b4ab30a"}[e]||e)+"."+{26:"c222073b",53:"64183bfb",498:"cc2869ef",540:"31d6fa01",664:"c5a748a4",669:"f6bb707c",814:"dc8c3a26",854:"318c7073",877:"c0663dda",1426:"567678eb",1517:"35b759b0",1644:"997caf2c",1686:"f210cc05",1840:"f186acec",1960:"055cc1fb",1976:"898ccb45",2236:"4429510b",2702:"07be10b1",2750:"1abeeb2c",3060:"caa5a8ea",3076:"0e1700a2",3085:"3a447380",3114:"88066c9d",3136:"7664a094",3184:"84890b1a",3203:"c0b8bfe8",3205:"79c66d4f",3212:"45747821",3235:"4cee896d",3237:"b8ec0c1b",3256:"2fee3ee1",3280:"a28d7ef7",3473:"fdffa07c",3722:"04d434b4",3748:"23864c69",3752:"97183597",3823:"9152a61f",3838:"feb6e86a",3856:"ed8a36f2",3869:"a586a221",3909:"848ea900",3923:"099cce05",3930:"e4b34b05",3963:"d708e98b",4069:"587130c3",4107:"65675b3d",4271:"c3134dff",4364:"b42d6708",4462:"e3da8e1d",4485:"ad729856",4838:"93393495",4856:"4d0c92b3",4871:"d0631441",4972:"4a54fd4a",5003:"0c88a717",5057:"34dc4342",5158:"edf3697e",5362:"861a1b81",5562:"cea9cd6e",5619:"65331529",5699:"98ae9519",5728:"61002cc5",5941:"8d32e00c",6026:"994b59d2",6355:"aad755b2",6387:"72e2664f",6390:"cd096c5d",6729:"4ebe1a53",6777:"e6b69ad5",6827:"9d021ba0",6846:"17373c13",6871:"5a8d034f",6933:"d57f2f92",7069:"0fb0ec88",7084:"a97a46cc",7090:"b376322d",7115:"c0e20bbe",7299:"5ddc6479",7370:"a95c0d20",7414:"62b71c07",7515:"ad1db548",7605:"2b86340f",7918:"e3da5265",7938:"33342650",8028:"e91541fa",8316:"e49d0502",8510:"cfeda3c9",8592:"d352ae33",8677:"a3714765",8929:"ebcb7c32",8949:"eaf424e2",9056:"09b03c42",9144:"45aa5325",9266:"83f31c48",9405:"4a1da309",9514:"478c02c6",9568:"2524e3d3",9817:"b7ea7ab7",9873:"a157f57b",9886:"81256d6d",9949:"eb4109f1",9977:"5ccdaa81"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},c="portal:",r.l=(e,a,f,d)=>{if(b[e])b[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/bn/",r.gca=function(e){return e={17896441:"7918","341e437f":"26","935f2afb":"53",b230cef3:"498",ea817fa8:"540",e2a9a44d:"664","75d09e6a":"669","11f97726":"854","30e80b05":"877",b1286164:"1426","88073ef8":"1517","8abbe93c":"1644","0e355509":"1686","15a0f153":"1840","9d2fc2dc":"1960","706c7c98":"1976","35145f99":"2236","5b971fb4":"2702",eabae628:"2750","437352a3":"3060","32d127ed":"3076","1f391b9e":"3085","0a794094":"3114","43ebd341":"3136",fff47811:"3184",fe910c09:"3205","2cdfdd8c":"3212",da6f36cd:"3235","1df93b7f":"3237","1f6b440c":"3256",ef42b41f:"3280",a3d57757:"3722","8c29294b":"3748","4595f990":"3752","0b49db57":"3823","408c56b8":"3838",c362cb1a:"3856","4dcf1dd4":"3869",ffa37b6f:"3909","08148a3c":"3923",ef1d8f5a:"3930","38669cdd":"3963",d2751ef1:"4069","75a6457a":"4107","5c3cdee1":"4271",a1560acb:"4364",cd945b23:"4462","342acbb2":"4485","0a77735a":"4838","62dca701":"4856","32cdcb85":"4871",efe308d1:"5003","9cd3fc89":"5057","49e497f9":"5158",c06dc13b:"5362","617ef373":"5562","4ed4c6d6":"5619","82be2c50":"5699",a5412652:"5728","3292a6e1":"5941",f0bc2ce1:"6026","0cbe556c":"6355","88bd40d1":"6387","975b026c":"6390",aa39a537:"6729",f7df798f:"6777","65ecfad5":"6827",a55f4ed6:"6846","0f86cb27":"6871","2d63a99b":"6933","1216a57d":"7069","9c184385":"7084","5bb53b34":"7090","74e6d608":"7115",ee1f7f2b:"7299",c09f4ff7:"7370","393be207":"7414","2e885ed0":"7515",dbfb85ee:"7605","198f37a8":"7938","32469a1b":"8028","811b7d78":"8316","4848325b":"8510","4827a2b4":"8592","7c854a6c":"8677","649a09e3":"8929",e8f18b53:"8949",c74b6c35:"9056",b2d410b4:"9144","2007f370":"9266",b46f25af:"9405","1be78505":"9514","58a9f2a8":"9568","14eb3368":"9817","6a82b540":"9873",f6563dcc:"9886","09271f0e":"9949","4b4ab30a":"9977"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var b=r.o(e,a)?e[a]:void 0;if(0!==b)if(b)f.push(b[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>b=e[a]=[f,c]));f.push(b[2]=c);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var c=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+d+")",t.name="ChunkLoadError",t.type=c,t.request=d,b[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var b,c,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/bn/docs/category/advanced-cli/index.html b/bn/docs/category/advanced-cli/index.html index ba7e3c4a155..44ea159ef84 100644 --- a/bn/docs/category/advanced-cli/index.html +++ b/bn/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/category/develop-on-nova-evm-/index.html b/bn/docs/category/develop-on-nova-evm-/index.html index 00cfe13c42a..fd2f0fc9868 100644 --- a/bn/docs/category/develop-on-nova-evm-/index.html +++ b/bn/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/bn/docs/category/develop/index.html b/bn/docs/category/develop/index.html index 4343bef4d00..87030e288b4 100644 --- a/bn/docs/category/develop/index.html +++ b/bn/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/category/farming/index.html b/bn/docs/category/farming/index.html index 65302db03f5..5517d14f378 100644 --- a/bn/docs/category/farming/index.html +++ b/bn/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/category/learn/index.html b/bn/docs/category/learn/index.html index 6012108b8ef..bbf79d34ba5 100644 --- a/bn/docs/category/learn/index.html +++ b/bn/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/category/operators-and-nominators/index.html b/bn/docs/category/operators-and-nominators/index.html index 3a20ea45a6f..c417fcabeaa 100644 --- a/bn/docs/category/operators-and-nominators/index.html +++ b/bn/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/category/participate/index.html b/bn/docs/category/participate/index.html index 4c769eb7d61..c729a853cea 100644 --- a/bn/docs/category/participate/index.html +++ b/bn/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/category/pulsar-recommended/index.html b/bn/docs/category/pulsar-recommended/index.html index c363804c370..1cba89c954e 100644 --- a/bn/docs/category/pulsar-recommended/index.html +++ b/bn/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/category/wallets/index.html b/bn/docs/category/wallets/index.html index ab6ed0479c6..50c75a21a10 100644 --- a/bn/docs/category/wallets/index.html +++ b/bn/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/develop/nova/block_explorer/index.html b/bn/docs/develop/nova/block_explorer/index.html index 79e9d5b221a..6cc26d89bd3 100644 --- a/bn/docs/develop/nova/block_explorer/index.html +++ b/bn/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/develop/nova/faucet/index.html b/bn/docs/develop/nova/faucet/index.html index 94a286d773b..957ac1bac4e 100644 --- a/bn/docs/develop/nova/faucet/index.html +++ b/bn/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/bn/docs/develop/nova/foundry_guide/index.html b/bn/docs/develop/nova/foundry_guide/index.html index 908cb4a5338..4df37da4780 100644 --- a/bn/docs/develop/nova/foundry_guide/index.html +++ b/bn/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/bn/docs/develop/nova/general-information/index.html b/bn/docs/develop/nova/general-information/index.html index 12a72e3c61e..515eb4bece2 100644 --- a/bn/docs/develop/nova/general-information/index.html +++ b/bn/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/bn/docs/develop/nova/hardhat_guide/index.html b/bn/docs/develop/nova/hardhat_guide/index.html index 0962d04741c..fd6e1b3def9 100644 --- a/bn/docs/develop/nova/hardhat_guide/index.html +++ b/bn/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/bn/docs/develop/nova/intro/index.html b/bn/docs/develop/nova/intro/index.html index cd58f5eae37..e291c7ff4c9 100644 --- a/bn/docs/develop/nova/intro/index.html +++ b/bn/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/bn/docs/develop/nova/local_development/index.html b/bn/docs/develop/nova/local_development/index.html index 4a6749b9262..ea08230977c 100644 --- a/bn/docs/develop/nova/local_development/index.html +++ b/bn/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/bn/docs/develop/nova/quick_start/index.html b/bn/docs/develop/nova/quick_start/index.html index 81cae59e3d2..5943e6fd2f4 100644 --- a/bn/docs/develop/nova/quick_start/index.html +++ b/bn/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/bn/docs/develop/nova/remix_guide/index.html b/bn/docs/develop/nova/remix_guide/index.html index 68ea171cc12..c8dd92e8cab 100644 --- a/bn/docs/develop/nova/remix_guide/index.html +++ b/bn/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/bn/docs/develop/nova/setting-up-metamask/index.html b/bn/docs/develop/nova/setting-up-metamask/index.html index 92713f5ee8e..7f4fe17d181 100644 --- a/bn/docs/develop/nova/setting-up-metamask/index.html +++ b/bn/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/bn/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 0e7432d5f18..c5d11a2a0bd 100644 --- a/bn/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/bn/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/bn/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 7d48ad90c4e..b3d57665860 100644 --- a/bn/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/bn/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/bn/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index fd1b918f2b6..e950756a6ae 100644 --- a/bn/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/bn/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/bn/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index a35729318c6..afdcd89ec07 100644 --- a/bn/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/bn/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/bn/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 53f540c00b3..3700494b100 100644 --- a/bn/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/bn/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/common_problems/index.html b/bn/docs/farming-&-staking/farming/common_problems/index.html index ce708d7175e..1f41b0f64bc 100644 --- a/bn/docs/farming-&-staking/farming/common_problems/index.html +++ b/bn/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/bn/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index edbf587bd9c..5e85c7b3f85 100644 --- a/bn/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/bn/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/bn/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 08dae72a5c5..cf5f36ed0de 100644 --- a/bn/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/bn/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/bn/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 187a642e34a..63d4c1aecb3 100644 --- a/bn/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/bn/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/bn/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 8159ac881a4..eb3e0d9159b 100644 --- a/bn/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/bn/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/index.html b/bn/docs/farming-&-staking/index.html index 7230bf77dca..5ee462e54d6 100644 --- a/bn/docs/farming-&-staking/index.html +++ b/bn/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/staking/index.html b/bn/docs/farming-&-staking/staking/index.html index 89c47ebbc36..60763659b33 100644 --- a/bn/docs/farming-&-staking/staking/index.html +++ b/bn/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/staking/intro/index.html b/bn/docs/farming-&-staking/staking/intro/index.html index 62818e8e957..f430066f1bf 100644 --- a/bn/docs/farming-&-staking/staking/intro/index.html +++ b/bn/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/staking/operators/index.html b/bn/docs/farming-&-staking/staking/operators/index.html index 315e93cff43..0bad318455f 100644 --- a/bn/docs/farming-&-staking/staking/operators/index.html +++ b/bn/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/timekeeping/index.html b/bn/docs/farming-&-staking/timekeeping/index.html index 102146d097e..3393e6a8fcf 100644 --- a/bn/docs/farming-&-staking/timekeeping/index.html +++ b/bn/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/wallets/polkadot/index.html b/bn/docs/farming-&-staking/wallets/polkadot/index.html index 9e9131e7914..890180c9af8 100644 --- a/bn/docs/farming-&-staking/wallets/polkadot/index.html +++ b/bn/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/bn/docs/farming-&-staking/wallets/subwallet/index.html b/bn/docs/farming-&-staking/wallets/subwallet/index.html index 9637300831a..670b41fab9b 100644 --- a/bn/docs/farming-&-staking/wallets/subwallet/index.html +++ b/bn/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/bn/docs/learn/intro/index.html b/bn/docs/learn/intro/index.html index 13a59299060..a1f7dbbfd0c 100644 --- a/bn/docs/learn/intro/index.html +++ b/bn/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/bn/docs/learn/security/index.html b/bn/docs/learn/security/index.html index cf01ec93bf3..21cd11ec11f 100644 --- a/bn/docs/learn/security/index.html +++ b/bn/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/bn/docs/learn/subnomicon/index.html b/bn/docs/learn/subnomicon/index.html index 8c00a59b33d..a96fe62ea54 100644 --- a/bn/docs/learn/subnomicon/index.html +++ b/bn/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/bn/docs/participate/CODE_OF_CONDUCT/index.html b/bn/docs/participate/CODE_OF_CONDUCT/index.html index a6d3b366945..8a1569d3335 100644 --- a/bn/docs/participate/CODE_OF_CONDUCT/index.html +++ b/bn/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/bn/docs/participate/contribute/index.html b/bn/docs/participate/contribute/index.html index dd09e14d5f5..dc911f9c386 100644 --- a/bn/docs/participate/contribute/index.html +++ b/bn/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/bn/docs/participate/index.html b/bn/docs/participate/index.html index b98ee6ca6d9..7a2ff4f13da 100644 --- a/bn/docs/participate/index.html +++ b/bn/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/bn/docs/participate/translate/index.html b/bn/docs/participate/translate/index.html index 056a4e4ed8d..c4983ac5430 100644 --- a/bn/docs/participate/translate/index.html +++ b/bn/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/additional-guides/index.html b/bn/docs/pre-release/category/additional-guides/index.html index 3395fa6022a..212490cfa3a 100644 --- a/bn/docs/pre-release/category/additional-guides/index.html +++ b/bn/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/advanced-cli/index.html b/bn/docs/pre-release/category/advanced-cli/index.html index 6403fefcdc0..ec3b70f9d55 100644 --- a/bn/docs/pre-release/category/advanced-cli/index.html +++ b/bn/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/develop-on-nova-evm-/index.html b/bn/docs/pre-release/category/develop-on-nova-evm-/index.html index 8433e7d6692..6ed45af7532 100644 --- a/bn/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/bn/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/develop/index.html b/bn/docs/pre-release/category/develop/index.html index 82ca0a227b3..ad914f2078d 100644 --- a/bn/docs/pre-release/category/develop/index.html +++ b/bn/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/farming/index.html b/bn/docs/pre-release/category/farming/index.html index d1b1de7f423..9a14f2223a7 100644 --- a/bn/docs/pre-release/category/farming/index.html +++ b/bn/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/learn/index.html b/bn/docs/pre-release/category/learn/index.html index f3b4a37d5f0..a79487ff51f 100644 --- a/bn/docs/pre-release/category/learn/index.html +++ b/bn/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/operators-and-nominators/index.html b/bn/docs/pre-release/category/operators-and-nominators/index.html index ef849452a90..8116a565ebb 100644 --- a/bn/docs/pre-release/category/operators-and-nominators/index.html +++ b/bn/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/participate/index.html b/bn/docs/pre-release/category/participate/index.html index 5f632a4a6dd..d6761d457b2 100644 --- a/bn/docs/pre-release/category/participate/index.html +++ b/bn/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/pulsar-recommended/index.html b/bn/docs/pre-release/category/pulsar-recommended/index.html index c3ca113d0b2..157b9c61ddf 100644 --- a/bn/docs/pre-release/category/pulsar-recommended/index.html +++ b/bn/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/category/wallets/index.html b/bn/docs/pre-release/category/wallets/index.html index e722a9499d5..c57f2c8e850 100644 --- a/bn/docs/pre-release/category/wallets/index.html +++ b/bn/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/block_explorer/index.html b/bn/docs/pre-release/develop/nova/block_explorer/index.html index bcff0c412a1..287cb93d2d3 100644 --- a/bn/docs/pre-release/develop/nova/block_explorer/index.html +++ b/bn/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/faucet/index.html b/bn/docs/pre-release/develop/nova/faucet/index.html index 9c1569dc1a5..0695e80b057 100644 --- a/bn/docs/pre-release/develop/nova/faucet/index.html +++ b/bn/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/foundry_guide/index.html b/bn/docs/pre-release/develop/nova/foundry_guide/index.html index 835be2791b2..9b8bd3fe140 100644 --- a/bn/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/bn/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/general-information/index.html b/bn/docs/pre-release/develop/nova/general-information/index.html index 58cef23cb67..8653a0b6681 100644 --- a/bn/docs/pre-release/develop/nova/general-information/index.html +++ b/bn/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/hardhat_guide/index.html b/bn/docs/pre-release/develop/nova/hardhat_guide/index.html index 58e6259dbe0..978f3f363cd 100644 --- a/bn/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/bn/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/intro/index.html b/bn/docs/pre-release/develop/nova/intro/index.html index ffb0a8b9029..14fdb0f2a29 100644 --- a/bn/docs/pre-release/develop/nova/intro/index.html +++ b/bn/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/local_development/index.html b/bn/docs/pre-release/develop/nova/local_development/index.html index f8e68e9f570..b9e8b0f4d8d 100644 --- a/bn/docs/pre-release/develop/nova/local_development/index.html +++ b/bn/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/quick_start/index.html b/bn/docs/pre-release/develop/nova/quick_start/index.html index d95e32b9107..044671c3d22 100644 --- a/bn/docs/pre-release/develop/nova/quick_start/index.html +++ b/bn/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/remix_guide/index.html b/bn/docs/pre-release/develop/nova/remix_guide/index.html index 2a11fbcd15a..d0f97d69cfd 100644 --- a/bn/docs/pre-release/develop/nova/remix_guide/index.html +++ b/bn/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/develop/nova/setting-up-metamask/index.html b/bn/docs/pre-release/develop/nova/setting-up-metamask/index.html index 2c94db78d5c..3b7b7e7b9b8 100644 --- a/bn/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/bn/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/bn/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index d0bb716be68..69c18914aa6 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 3e5f5e5074a..66b50d115ae 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index c383135bef8..424be8ee79f 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 3ddfd71159f..5c3c0a8df3a 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index e494f012418..73af8775179 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/bn/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 46c8ee2ce4e..b41cead0805 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 0147796ac89..8838cdd4d40 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 54eec66cd2c..228dd5a6730 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 228d66237ff..271abdd5044 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 40f8e2c8f99..fc772cf14f6 100644 --- a/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/bn/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/index.html b/bn/docs/pre-release/farming-&-staking/index.html index f3da76609df..2661dfac24b 100644 --- a/bn/docs/pre-release/farming-&-staking/index.html +++ b/bn/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/staking/index.html b/bn/docs/pre-release/farming-&-staking/staking/index.html index 412d5208a8a..1c30fc9f169 100644 --- a/bn/docs/pre-release/farming-&-staking/staking/index.html +++ b/bn/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/staking/intro/index.html b/bn/docs/pre-release/farming-&-staking/staking/intro/index.html index 8684231bffd..a79aacaa287 100644 --- a/bn/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/bn/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/staking/operators/index.html b/bn/docs/pre-release/farming-&-staking/staking/operators/index.html index a05edb8104c..d94e9fce97e 100644 --- a/bn/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/bn/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/timekeeping/index.html b/bn/docs/pre-release/farming-&-staking/timekeeping/index.html index 9815a0a3dc2..a10f70ed468 100644 --- a/bn/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/bn/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/bn/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 08d65c86fda..03ef13af657 100644 --- a/bn/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/bn/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/bn/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index 74986ba516b..0ab793d7a7c 100644 --- a/bn/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/bn/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/learn/intro/index.html b/bn/docs/pre-release/learn/intro/index.html index f01d0069e42..bc43c9c046f 100644 --- a/bn/docs/pre-release/learn/intro/index.html +++ b/bn/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/learn/security/index.html b/bn/docs/pre-release/learn/security/index.html index cbafc35e080..371a436fe86 100644 --- a/bn/docs/pre-release/learn/security/index.html +++ b/bn/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/learn/subnomicon/index.html b/bn/docs/pre-release/learn/subnomicon/index.html index 8353034fc0f..573dfaa5ea7 100644 --- a/bn/docs/pre-release/learn/subnomicon/index.html +++ b/bn/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/bn/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index dfeb1d9a169..8f26de07e25 100644 --- a/bn/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/bn/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/participate/contribute/index.html b/bn/docs/pre-release/participate/contribute/index.html index ac5cc910241..167efaff8f2 100644 --- a/bn/docs/pre-release/participate/contribute/index.html +++ b/bn/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/bn/docs/pre-release/participate/index.html b/bn/docs/pre-release/participate/index.html index 2ddc5df1bfd..aa95d15f652 100644 --- a/bn/docs/pre-release/participate/index.html +++ b/bn/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/bn/docs/pre-release/participate/translate/index.html b/bn/docs/pre-release/participate/translate/index.html index 053930e254a..a7f54afe9a4 100644 --- a/bn/docs/pre-release/participate/translate/index.html +++ b/bn/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/bn/index.html b/bn/index.html index 598468f6a78..b032bd830de 100644 --- a/bn/index.html +++ b/bn/index.html @@ -7,13 +7,13 @@ - +

    যেখানেই ফার্ম

    অতিরিক্ত ডিস্ক প্রতিজ্ঞা করে একটি ফার্মার নোড চালানোর মাধ্যমে পুরস্কার অর্জন করুন। কোনও দামি সেটআপ বা আগের মূলধন প্রয়োজন নেই।

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/bn/markdown-page/index.html b/bn/markdown-page/index.html index 48503eea43b..5f7f0f7c0a4 100644 --- a/bn/markdown-page/index.html +++ b/bn/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/404.html b/de/404.html index 9a1b3206696..ffe762f9f89 100644 --- a/de/404.html +++ b/de/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/assets/js/d44305e7.79be7059.js b/de/assets/js/d44305e7.79be7059.js deleted file mode 100644 index d3b7f1a3801..00000000000 --- a/de/assets/js/d44305e7.79be7059.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[1430],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},787:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/de/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/de/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/de/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/de/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/de/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/de/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/de/assets/js/d44305e7.96ba2c29.js b/de/assets/js/d44305e7.96ba2c29.js new file mode 100644 index 00000000000..184b1e753ab --- /dev/null +++ b/de/assets/js/d44305e7.96ba2c29.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[1430],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},787:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/de/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/de/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/de/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/de/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/de/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/de/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/de/assets/js/f8086ca9.7b5fd98a.js b/de/assets/js/f8086ca9.7b5fd98a.js new file mode 100644 index 00000000000..7f230c5c915 --- /dev/null +++ b/de/assets/js/f8086ca9.7b5fd98a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4477],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1631:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/de/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/de/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/de/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/de/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/de/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/de/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/de/assets/js/f8086ca9.d0d07b8c.js b/de/assets/js/f8086ca9.d0d07b8c.js deleted file mode 100644 index 83c869ce654..00000000000 --- a/de/assets/js/f8086ca9.d0d07b8c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4477],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1631:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/de/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/de/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/de/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/de/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/de/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/de/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/de/assets/js/runtime~main.3e351d49.js b/de/assets/js/runtime~main.7c401a5c.js similarity index 98% rename from de/assets/js/runtime~main.3e351d49.js rename to de/assets/js/runtime~main.7c401a5c.js index ec620b001c6..ac522467312 100644 --- a/de/assets/js/runtime~main.3e351d49.js +++ b/de/assets/js/runtime~main.7c401a5c.js @@ -1 +1 @@ -(()=>{"use strict";var e,f,a,c,d,b={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var a=t[e]={exports:{}};return b[e].call(a.exports,a,a.exports,r),a.exports}r.m=b,e=[],r.O=(f,a,c,d)=>{if(!a){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,c,d]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};f=f||[null,a({}),a([]),a(a)];for(var t=2&c&&e;"object"==typeof t&&!~f.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((f=>b[f]=()=>e[f]));return b.default=()=>e,r.d(d,b),d},r.d=(e,f)=>{for(var a in f)r.o(f,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,a)=>(r.f[a](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",71:"29d083be",199:"b8ec4b34",313:"0c1827d4",316:"d0642af9",399:"7f6021ef",598:"d0a718e5",633:"dbaa0366",660:"2bae884d",682:"e8008dc2",999:"6f12b15f",1049:"03a38ae3",1205:"9489c28f",1430:"d44305e7",1506:"eb145fdc",1514:"b6e141fb",1716:"8c2d5ed4",1720:"af7d838b",1852:"9f35487d",1853:"9626c048",1929:"6b89ad76",2179:"c89ea2bf",2277:"b3499da1",2405:"bbfc0b07",2449:"98f388d3",2643:"b35d8a88",3055:"9baa76e7",3079:"6e156b5f",3085:"1f391b9e",3186:"71611161",3216:"90b7c7f7",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3375:"4d7e3f1d",3571:"634225cd",3892:"ce66e923",3981:"0026ba52",4160:"eae14d1c",4172:"a72206c2",4392:"ef04a2b9",4477:"f8086ca9",4483:"fc0d36d8",4485:"11f2ede7",4500:"89a77fd1",4530:"038228f6",4722:"22aefcec",4859:"c8931810",5052:"567090f3",5074:"d49ec705",5339:"7908a40f",5458:"fb94e27e",5566:"f1625fc2",6063:"be0e4f76",6236:"f8d25bc6",6336:"092c81e5",6357:"327c1d14",6374:"14a8996d",6375:"d8f0efc0",6482:"408ad2c4",6552:"c323b532",6789:"17b2903a",6895:"50e92b62",7263:"0df2fcc9",7291:"41095ea8",7304:"ebc5a296",7326:"5a3f9f86",7370:"c09f4ff7",7414:"393be207",7610:"09329b59",7666:"6d0fe5c0",7674:"1aabaf55",7780:"b5c5e4e5",7849:"5a050c99",7874:"95272d70",7899:"8d0c2a6b",7918:"17896441",8018:"76b4af98",8247:"0b7619d0",8282:"02157070",8386:"18dee487",8560:"cabed0df",8743:"f53753eb",8898:"880997ba",8938:"eb9bb712",8998:"be0dfd88",9103:"69897ba3",9208:"2b3d888f",9228:"88cf59ef",9470:"64e8caa0",9492:"52aa0c94",9514:"1be78505",9573:"7701c5b9",9647:"bc058f26",9681:"281f775d",9724:"2a745845",9817:"14eb3368",9913:"ced4c030"}[e]||e)+"."+{53:"0df21a85",71:"73b8cc7c",199:"69b50ee7",313:"467dfbe7",316:"832e77f2",399:"6dc95747",598:"9919a851",633:"2ba91063",660:"b35a424b",682:"5953ebd7",814:"dc8c3a26",999:"3e658a60",1049:"c93d0935",1205:"d146526c",1430:"79be7059",1506:"d7769452",1514:"0cb086b0",1716:"24a8421a",1720:"44c9d60a",1852:"da76cedd",1853:"ee344f16",1929:"f16b5c82",2179:"b339dee6",2277:"ca95cd3c",2405:"bd630ea2",2449:"592a4e12",2643:"24d0e0d8",3055:"4b94b063",3079:"d480c627",3085:"3a447380",3186:"2180ce51",3203:"c0b8bfe8",3216:"80fbec71",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3375:"e2a9d366",3473:"fdffa07c",3571:"e139082b",3892:"8d5717a3",3981:"551e3042",4160:"06b86611",4172:"0f5ae2e2",4392:"0130f45f",4477:"d0d07b8c",4483:"c6a5c15a",4485:"cae8bd49",4500:"99e3f049",4530:"7641cee2",4722:"99310a64",4859:"c2f6dcba",4972:"4a54fd4a",5052:"8fe4a5d6",5074:"19ad7326",5339:"29c5668d",5458:"f8dadef5",5566:"5fcc6ecf",6063:"fe044ac9",6236:"eb37cf48",6336:"909bcd54",6357:"c3e0fe16",6374:"4bc7071b",6375:"ebf00d38",6482:"fba391c5",6552:"7d413f28",6789:"0fbe9a94",6895:"bdc80162",7263:"5667f544",7291:"e4706a38",7304:"851c376c",7326:"98f84c34",7370:"712de1e8",7414:"ff35eb51",7610:"31f9032a",7666:"e64a8518",7674:"66bf19e6",7780:"5eb6260c",7849:"e2d1c654",7874:"df65b8eb",7899:"dfacc367",7918:"e3da5265",8018:"5eb88df3",8247:"2e94f11d",8282:"54a2e98f",8386:"e6a84a0f",8560:"256afb48",8743:"408eedaa",8898:"1f41a842",8938:"53a6b748",8998:"41dd0cd6",9103:"a8295e52",9208:"2fb6d752",9228:"928b5a52",9470:"2cb0c073",9492:"44712356",9514:"478c02c6",9573:"df0cf741",9647:"67b13dd0",9681:"7035ffb6",9724:"0cdb8415",9817:"b7ea7ab7",9913:"54a1a8e6"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),c={},d="portal:",r.l=(e,f,a,b)=>{if(c[e])c[e].push(f);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(a))),f)return f(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/de/",r.gca=function(e){return e={17896441:"7918",71611161:"3186","935f2afb":"53","29d083be":"71",b8ec4b34:"199","0c1827d4":"313",d0642af9:"316","7f6021ef":"399",d0a718e5:"598",dbaa0366:"633","2bae884d":"660",e8008dc2:"682","6f12b15f":"999","03a38ae3":"1049","9489c28f":"1205",d44305e7:"1430",eb145fdc:"1506",b6e141fb:"1514","8c2d5ed4":"1716",af7d838b:"1720","9f35487d":"1852","9626c048":"1853","6b89ad76":"1929",c89ea2bf:"2179",b3499da1:"2277",bbfc0b07:"2405","98f388d3":"2449",b35d8a88:"2643","9baa76e7":"3055","6e156b5f":"3079","1f391b9e":"3085","90b7c7f7":"3216",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","4d7e3f1d":"3375","634225cd":"3571",ce66e923:"3892","0026ba52":"3981",eae14d1c:"4160",a72206c2:"4172",ef04a2b9:"4392",f8086ca9:"4477",fc0d36d8:"4483","11f2ede7":"4485","89a77fd1":"4500","038228f6":"4530","22aefcec":"4722",c8931810:"4859","567090f3":"5052",d49ec705:"5074","7908a40f":"5339",fb94e27e:"5458",f1625fc2:"5566",be0e4f76:"6063",f8d25bc6:"6236","092c81e5":"6336","327c1d14":"6357","14a8996d":"6374",d8f0efc0:"6375","408ad2c4":"6482",c323b532:"6552","17b2903a":"6789","50e92b62":"6895","0df2fcc9":"7263","41095ea8":"7291",ebc5a296:"7304","5a3f9f86":"7326",c09f4ff7:"7370","393be207":"7414","09329b59":"7610","6d0fe5c0":"7666","1aabaf55":"7674",b5c5e4e5:"7780","5a050c99":"7849","95272d70":"7874","8d0c2a6b":"7899","76b4af98":"8018","0b7619d0":"8247","02157070":"8282","18dee487":"8386",cabed0df:"8560",f53753eb:"8743","880997ba":"8898",eb9bb712:"8938",be0dfd88:"8998","69897ba3":"9103","2b3d888f":"9208","88cf59ef":"9228","64e8caa0":"9470","52aa0c94":"9492","1be78505":"9514","7701c5b9":"9573",bc058f26:"9647","281f775d":"9681","2a745845":"9724","14eb3368":"9817",ced4c030:"9913"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,a)=>{var c=r.o(e,f)?e[f]:void 0;if(0!==c)if(c)a.push(c[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var d=new Promise(((a,d)=>c=e[f]=[a,d]));a.push(c[2]=d);var b=r.p+r.u(f),t=new Error;r.l(b,(a=>{if(r.o(e,f)&&(0!==(c=e[f])&&(e[f]=void 0),c)){var d=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+f+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,a)=>{var c,d,b=a[0],t=a[1],o=a[2],n=0;if(b.some((f=>0!==e[f]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(f&&f(a);n{"use strict";var e,f,a,c,d,b={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var a=t[e]={exports:{}};return b[e].call(a.exports,a,a.exports,r),a.exports}r.m=b,e=[],r.O=(f,a,c,d)=>{if(!a){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,c,d]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};f=f||[null,a({}),a([]),a(a)];for(var t=2&c&&e;"object"==typeof t&&!~f.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((f=>b[f]=()=>e[f]));return b.default=()=>e,r.d(d,b),d},r.d=(e,f)=>{for(var a in f)r.o(f,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,a)=>(r.f[a](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",71:"29d083be",199:"b8ec4b34",313:"0c1827d4",316:"d0642af9",399:"7f6021ef",598:"d0a718e5",633:"dbaa0366",660:"2bae884d",682:"e8008dc2",999:"6f12b15f",1049:"03a38ae3",1205:"9489c28f",1430:"d44305e7",1506:"eb145fdc",1514:"b6e141fb",1716:"8c2d5ed4",1720:"af7d838b",1852:"9f35487d",1853:"9626c048",1929:"6b89ad76",2179:"c89ea2bf",2277:"b3499da1",2405:"bbfc0b07",2449:"98f388d3",2643:"b35d8a88",3055:"9baa76e7",3079:"6e156b5f",3085:"1f391b9e",3186:"71611161",3216:"90b7c7f7",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3375:"4d7e3f1d",3571:"634225cd",3892:"ce66e923",3981:"0026ba52",4160:"eae14d1c",4172:"a72206c2",4392:"ef04a2b9",4477:"f8086ca9",4483:"fc0d36d8",4485:"11f2ede7",4500:"89a77fd1",4530:"038228f6",4722:"22aefcec",4859:"c8931810",5052:"567090f3",5074:"d49ec705",5339:"7908a40f",5458:"fb94e27e",5566:"f1625fc2",6063:"be0e4f76",6236:"f8d25bc6",6336:"092c81e5",6357:"327c1d14",6374:"14a8996d",6375:"d8f0efc0",6482:"408ad2c4",6552:"c323b532",6789:"17b2903a",6895:"50e92b62",7263:"0df2fcc9",7291:"41095ea8",7304:"ebc5a296",7326:"5a3f9f86",7370:"c09f4ff7",7414:"393be207",7610:"09329b59",7666:"6d0fe5c0",7674:"1aabaf55",7780:"b5c5e4e5",7849:"5a050c99",7874:"95272d70",7899:"8d0c2a6b",7918:"17896441",8018:"76b4af98",8247:"0b7619d0",8282:"02157070",8386:"18dee487",8560:"cabed0df",8743:"f53753eb",8898:"880997ba",8938:"eb9bb712",8998:"be0dfd88",9103:"69897ba3",9208:"2b3d888f",9228:"88cf59ef",9470:"64e8caa0",9492:"52aa0c94",9514:"1be78505",9573:"7701c5b9",9647:"bc058f26",9681:"281f775d",9724:"2a745845",9817:"14eb3368",9913:"ced4c030"}[e]||e)+"."+{53:"0df21a85",71:"73b8cc7c",199:"69b50ee7",313:"467dfbe7",316:"832e77f2",399:"6dc95747",598:"9919a851",633:"2ba91063",660:"b35a424b",682:"5953ebd7",814:"dc8c3a26",999:"3e658a60",1049:"c93d0935",1205:"d146526c",1430:"96ba2c29",1506:"d7769452",1514:"0cb086b0",1716:"24a8421a",1720:"44c9d60a",1852:"da76cedd",1853:"ee344f16",1929:"f16b5c82",2179:"b339dee6",2277:"ca95cd3c",2405:"bd630ea2",2449:"592a4e12",2643:"24d0e0d8",3055:"4b94b063",3079:"d480c627",3085:"3a447380",3186:"2180ce51",3203:"c0b8bfe8",3216:"80fbec71",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3375:"e2a9d366",3473:"fdffa07c",3571:"e139082b",3892:"8d5717a3",3981:"551e3042",4160:"06b86611",4172:"0f5ae2e2",4392:"0130f45f",4477:"7b5fd98a",4483:"c6a5c15a",4485:"cae8bd49",4500:"99e3f049",4530:"7641cee2",4722:"99310a64",4859:"c2f6dcba",4972:"4a54fd4a",5052:"8fe4a5d6",5074:"19ad7326",5339:"29c5668d",5458:"f8dadef5",5566:"5fcc6ecf",6063:"fe044ac9",6236:"eb37cf48",6336:"909bcd54",6357:"c3e0fe16",6374:"4bc7071b",6375:"ebf00d38",6482:"fba391c5",6552:"7d413f28",6789:"0fbe9a94",6895:"bdc80162",7263:"5667f544",7291:"e4706a38",7304:"851c376c",7326:"98f84c34",7370:"712de1e8",7414:"ff35eb51",7610:"31f9032a",7666:"e64a8518",7674:"66bf19e6",7780:"5eb6260c",7849:"e2d1c654",7874:"df65b8eb",7899:"dfacc367",7918:"e3da5265",8018:"5eb88df3",8247:"2e94f11d",8282:"54a2e98f",8386:"e6a84a0f",8560:"256afb48",8743:"408eedaa",8898:"1f41a842",8938:"53a6b748",8998:"41dd0cd6",9103:"a8295e52",9208:"2fb6d752",9228:"928b5a52",9470:"2cb0c073",9492:"44712356",9514:"478c02c6",9573:"df0cf741",9647:"67b13dd0",9681:"7035ffb6",9724:"0cdb8415",9817:"b7ea7ab7",9913:"54a1a8e6"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),c={},d="portal:",r.l=(e,f,a,b)=>{if(c[e])c[e].push(f);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(a))),f)return f(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/de/",r.gca=function(e){return e={17896441:"7918",71611161:"3186","935f2afb":"53","29d083be":"71",b8ec4b34:"199","0c1827d4":"313",d0642af9:"316","7f6021ef":"399",d0a718e5:"598",dbaa0366:"633","2bae884d":"660",e8008dc2:"682","6f12b15f":"999","03a38ae3":"1049","9489c28f":"1205",d44305e7:"1430",eb145fdc:"1506",b6e141fb:"1514","8c2d5ed4":"1716",af7d838b:"1720","9f35487d":"1852","9626c048":"1853","6b89ad76":"1929",c89ea2bf:"2179",b3499da1:"2277",bbfc0b07:"2405","98f388d3":"2449",b35d8a88:"2643","9baa76e7":"3055","6e156b5f":"3079","1f391b9e":"3085","90b7c7f7":"3216",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","4d7e3f1d":"3375","634225cd":"3571",ce66e923:"3892","0026ba52":"3981",eae14d1c:"4160",a72206c2:"4172",ef04a2b9:"4392",f8086ca9:"4477",fc0d36d8:"4483","11f2ede7":"4485","89a77fd1":"4500","038228f6":"4530","22aefcec":"4722",c8931810:"4859","567090f3":"5052",d49ec705:"5074","7908a40f":"5339",fb94e27e:"5458",f1625fc2:"5566",be0e4f76:"6063",f8d25bc6:"6236","092c81e5":"6336","327c1d14":"6357","14a8996d":"6374",d8f0efc0:"6375","408ad2c4":"6482",c323b532:"6552","17b2903a":"6789","50e92b62":"6895","0df2fcc9":"7263","41095ea8":"7291",ebc5a296:"7304","5a3f9f86":"7326",c09f4ff7:"7370","393be207":"7414","09329b59":"7610","6d0fe5c0":"7666","1aabaf55":"7674",b5c5e4e5:"7780","5a050c99":"7849","95272d70":"7874","8d0c2a6b":"7899","76b4af98":"8018","0b7619d0":"8247","02157070":"8282","18dee487":"8386",cabed0df:"8560",f53753eb:"8743","880997ba":"8898",eb9bb712:"8938",be0dfd88:"8998","69897ba3":"9103","2b3d888f":"9208","88cf59ef":"9228","64e8caa0":"9470","52aa0c94":"9492","1be78505":"9514","7701c5b9":"9573",bc058f26:"9647","281f775d":"9681","2a745845":"9724","14eb3368":"9817",ced4c030:"9913"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,a)=>{var c=r.o(e,f)?e[f]:void 0;if(0!==c)if(c)a.push(c[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var d=new Promise(((a,d)=>c=e[f]=[a,d]));a.push(c[2]=d);var b=r.p+r.u(f),t=new Error;r.l(b,(a=>{if(r.o(e,f)&&(0!==(c=e[f])&&(e[f]=void 0),c)){var d=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+f+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,a)=>{var c,d,b=a[0],t=a[1],o=a[2],n=0;if(b.some((f=>0!==e[f]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(f&&f(a);n - + - + \ No newline at end of file diff --git a/de/docs/category/advanced-cli/index.html b/de/docs/category/advanced-cli/index.html index f9c60d0232a..088789490ed 100644 --- a/de/docs/category/advanced-cli/index.html +++ b/de/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/category/develop-on-nova-evm-/index.html b/de/docs/category/develop-on-nova-evm-/index.html index 3d2b39a1fed..507cb24f17a 100644 --- a/de/docs/category/develop-on-nova-evm-/index.html +++ b/de/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/de/docs/category/develop/index.html b/de/docs/category/develop/index.html index fb551c6ec6a..77bb7367622 100644 --- a/de/docs/category/develop/index.html +++ b/de/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/category/farming/index.html b/de/docs/category/farming/index.html index ec2bf200d59..62fd2a239fa 100644 --- a/de/docs/category/farming/index.html +++ b/de/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/category/learn/index.html b/de/docs/category/learn/index.html index 4cf13c03218..77612bd8209 100644 --- a/de/docs/category/learn/index.html +++ b/de/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/category/operators-and-nominators/index.html b/de/docs/category/operators-and-nominators/index.html index 020137a26a9..8aeee6d75d9 100644 --- a/de/docs/category/operators-and-nominators/index.html +++ b/de/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/category/participate/index.html b/de/docs/category/participate/index.html index 686de3a8f04..107dd2bbfb8 100644 --- a/de/docs/category/participate/index.html +++ b/de/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/category/pulsar-recommended/index.html b/de/docs/category/pulsar-recommended/index.html index 7cc45a5927c..2529c1cb53e 100644 --- a/de/docs/category/pulsar-recommended/index.html +++ b/de/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/category/wallets/index.html b/de/docs/category/wallets/index.html index 11d2291006d..62bd48a021e 100644 --- a/de/docs/category/wallets/index.html +++ b/de/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/develop/nova/block_explorer/index.html b/de/docs/develop/nova/block_explorer/index.html index b1862e65d30..0fd184122aa 100644 --- a/de/docs/develop/nova/block_explorer/index.html +++ b/de/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/develop/nova/faucet/index.html b/de/docs/develop/nova/faucet/index.html index f72b2425ec7..3ed1423f5e7 100644 --- a/de/docs/develop/nova/faucet/index.html +++ b/de/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/de/docs/develop/nova/foundry_guide/index.html b/de/docs/develop/nova/foundry_guide/index.html index b22a37dede0..13b6d173538 100644 --- a/de/docs/develop/nova/foundry_guide/index.html +++ b/de/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/de/docs/develop/nova/general-information/index.html b/de/docs/develop/nova/general-information/index.html index ac344a3d589..65815afaaf5 100644 --- a/de/docs/develop/nova/general-information/index.html +++ b/de/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/de/docs/develop/nova/hardhat_guide/index.html b/de/docs/develop/nova/hardhat_guide/index.html index f329e3e3c1b..5cb60871daf 100644 --- a/de/docs/develop/nova/hardhat_guide/index.html +++ b/de/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/de/docs/develop/nova/intro/index.html b/de/docs/develop/nova/intro/index.html index ff2dd7a51a7..6aeb2e251e4 100644 --- a/de/docs/develop/nova/intro/index.html +++ b/de/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/de/docs/develop/nova/local_development/index.html b/de/docs/develop/nova/local_development/index.html index 35a22d71c4b..5278c93d1a5 100644 --- a/de/docs/develop/nova/local_development/index.html +++ b/de/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/de/docs/develop/nova/quick_start/index.html b/de/docs/develop/nova/quick_start/index.html index 33762a94769..2c5b3358d54 100644 --- a/de/docs/develop/nova/quick_start/index.html +++ b/de/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/de/docs/develop/nova/remix_guide/index.html b/de/docs/develop/nova/remix_guide/index.html index 6c6e7146f64..e016edbcb80 100644 --- a/de/docs/develop/nova/remix_guide/index.html +++ b/de/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/de/docs/develop/nova/setting-up-metamask/index.html b/de/docs/develop/nova/setting-up-metamask/index.html index 2f7e82af604..c8ab8c73dde 100644 --- a/de/docs/develop/nova/setting-up-metamask/index.html +++ b/de/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/de/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 7cf711e7fc0..8b7b9229094 100644 --- a/de/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/de/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/de/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 9872a240e3e..d67a38cb919 100644 --- a/de/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/de/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/de/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index edd9249bf1f..f11efa85639 100644 --- a/de/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/de/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/de/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 911daa9caee..7b8a44c5b14 100644 --- a/de/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/de/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/de/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index a5c2a5e348b..8a3ba2fbc48 100644 --- a/de/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/de/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/common_problems/index.html b/de/docs/farming-&-staking/farming/common_problems/index.html index 34db33ad094..536ad62227c 100644 --- a/de/docs/farming-&-staking/farming/common_problems/index.html +++ b/de/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/de/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 7a1a10219f6..516a9d656cb 100644 --- a/de/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/de/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/de/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 01296806b76..ba8a857c14d 100644 --- a/de/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/de/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/de/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 8164c0eb020..84c82f9349d 100644 --- a/de/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/de/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/de/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 46e761a09da..a7e79e94b42 100644 --- a/de/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/de/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/index.html b/de/docs/farming-&-staking/index.html index cb8905aa630..51e170e9340 100644 --- a/de/docs/farming-&-staking/index.html +++ b/de/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/staking/index.html b/de/docs/farming-&-staking/staking/index.html index c56c1c2d2ad..181121cd827 100644 --- a/de/docs/farming-&-staking/staking/index.html +++ b/de/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/staking/intro/index.html b/de/docs/farming-&-staking/staking/intro/index.html index 2548854da82..8309c0a8b84 100644 --- a/de/docs/farming-&-staking/staking/intro/index.html +++ b/de/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/staking/operators/index.html b/de/docs/farming-&-staking/staking/operators/index.html index c6369c5119d..1ddc61f5c56 100644 --- a/de/docs/farming-&-staking/staking/operators/index.html +++ b/de/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/timekeeping/index.html b/de/docs/farming-&-staking/timekeeping/index.html index 44ad851d269..b0d40efbc52 100644 --- a/de/docs/farming-&-staking/timekeeping/index.html +++ b/de/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/wallets/polkadot/index.html b/de/docs/farming-&-staking/wallets/polkadot/index.html index e8904256e4b..04651fa2d15 100644 --- a/de/docs/farming-&-staking/wallets/polkadot/index.html +++ b/de/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/de/docs/farming-&-staking/wallets/subwallet/index.html b/de/docs/farming-&-staking/wallets/subwallet/index.html index 84951d54aef..96a6aa2a718 100644 --- a/de/docs/farming-&-staking/wallets/subwallet/index.html +++ b/de/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/de/docs/learn/intro/index.html b/de/docs/learn/intro/index.html index 3277a71c262..1b3c8d58bc3 100644 --- a/de/docs/learn/intro/index.html +++ b/de/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/de/docs/learn/security/index.html b/de/docs/learn/security/index.html index 3a36e553224..09a892e7824 100644 --- a/de/docs/learn/security/index.html +++ b/de/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/de/docs/learn/subnomicon/index.html b/de/docs/learn/subnomicon/index.html index 98c26d06e46..13b5d828edf 100644 --- a/de/docs/learn/subnomicon/index.html +++ b/de/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/de/docs/participate/CODE_OF_CONDUCT/index.html b/de/docs/participate/CODE_OF_CONDUCT/index.html index a1a88806522..808ab983b44 100644 --- a/de/docs/participate/CODE_OF_CONDUCT/index.html +++ b/de/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/de/docs/participate/contribute/index.html b/de/docs/participate/contribute/index.html index 1d3346adb0e..6ea85b4b591 100644 --- a/de/docs/participate/contribute/index.html +++ b/de/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/de/docs/participate/index.html b/de/docs/participate/index.html index e5ddf6078b5..8ec3ad519d9 100644 --- a/de/docs/participate/index.html +++ b/de/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/de/docs/participate/translate/index.html b/de/docs/participate/translate/index.html index b3c8f9d6b09..a0eb6dfa0c0 100644 --- a/de/docs/participate/translate/index.html +++ b/de/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/category/additional-guides/index.html b/de/docs/pre-release/category/additional-guides/index.html index 7e71f140c70..2087470ae2c 100644 --- a/de/docs/pre-release/category/additional-guides/index.html +++ b/de/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/advanced-cli/index.html b/de/docs/pre-release/category/advanced-cli/index.html index e6b2d254367..54072e8732b 100644 --- a/de/docs/pre-release/category/advanced-cli/index.html +++ b/de/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/develop-on-nova-evm-/index.html b/de/docs/pre-release/category/develop-on-nova-evm-/index.html index e8baa8b28d1..78541ae76dc 100644 --- a/de/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/de/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/de/docs/pre-release/category/develop/index.html b/de/docs/pre-release/category/develop/index.html index 112b336ee68..32a24f89f9d 100644 --- a/de/docs/pre-release/category/develop/index.html +++ b/de/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/farming/index.html b/de/docs/pre-release/category/farming/index.html index 8218fd27979..30240a894c8 100644 --- a/de/docs/pre-release/category/farming/index.html +++ b/de/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/learn/index.html b/de/docs/pre-release/category/learn/index.html index 3bc5298138e..4d9e85afa61 100644 --- a/de/docs/pre-release/category/learn/index.html +++ b/de/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/operators-and-nominators/index.html b/de/docs/pre-release/category/operators-and-nominators/index.html index 100404bc842..38fa9722a0d 100644 --- a/de/docs/pre-release/category/operators-and-nominators/index.html +++ b/de/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/participate/index.html b/de/docs/pre-release/category/participate/index.html index 73a8b66d39c..198359c7d9c 100644 --- a/de/docs/pre-release/category/participate/index.html +++ b/de/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/pulsar-recommended/index.html b/de/docs/pre-release/category/pulsar-recommended/index.html index a7ab97d8c34..cd3c36d146a 100644 --- a/de/docs/pre-release/category/pulsar-recommended/index.html +++ b/de/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/category/wallets/index.html b/de/docs/pre-release/category/wallets/index.html index 8bcca0d9970..d3f4cd30bb9 100644 --- a/de/docs/pre-release/category/wallets/index.html +++ b/de/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/block_explorer/index.html b/de/docs/pre-release/develop/nova/block_explorer/index.html index 602ba02cb76..d983c0b72e5 100644 --- a/de/docs/pre-release/develop/nova/block_explorer/index.html +++ b/de/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/faucet/index.html b/de/docs/pre-release/develop/nova/faucet/index.html index 52a351b11fa..4943629ef93 100644 --- a/de/docs/pre-release/develop/nova/faucet/index.html +++ b/de/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/foundry_guide/index.html b/de/docs/pre-release/develop/nova/foundry_guide/index.html index ddace38c5c6..4abecfbce18 100644 --- a/de/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/de/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/general-information/index.html b/de/docs/pre-release/develop/nova/general-information/index.html index 4f19de93432..55602e0bfe7 100644 --- a/de/docs/pre-release/develop/nova/general-information/index.html +++ b/de/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/hardhat_guide/index.html b/de/docs/pre-release/develop/nova/hardhat_guide/index.html index 9cac837c43d..e4cadddef18 100644 --- a/de/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/de/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/intro/index.html b/de/docs/pre-release/develop/nova/intro/index.html index 2ad77e47480..e1d1ad7945a 100644 --- a/de/docs/pre-release/develop/nova/intro/index.html +++ b/de/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/local_development/index.html b/de/docs/pre-release/develop/nova/local_development/index.html index 08889b878b6..8501baf8b45 100644 --- a/de/docs/pre-release/develop/nova/local_development/index.html +++ b/de/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/quick_start/index.html b/de/docs/pre-release/develop/nova/quick_start/index.html index b1363108f85..37aac3ea68d 100644 --- a/de/docs/pre-release/develop/nova/quick_start/index.html +++ b/de/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/remix_guide/index.html b/de/docs/pre-release/develop/nova/remix_guide/index.html index 59f04e23808..8b58b83920f 100644 --- a/de/docs/pre-release/develop/nova/remix_guide/index.html +++ b/de/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/de/docs/pre-release/develop/nova/setting-up-metamask/index.html b/de/docs/pre-release/develop/nova/setting-up-metamask/index.html index 63ade205839..547c96716e9 100644 --- a/de/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/de/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/de/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index bb1fc0ee879..e1e2c48b103 100644 --- a/de/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 82c58c655d8..f40f8991488 100644 --- a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 10321323a08..51be1540ded 100644 --- a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index ba992c8ac5e..13cd8116e02 100644 --- a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index d4d75a1bda5..de15c44c09e 100644 --- a/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/de/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 05e6df6ef67..53b210f36ca 100644 --- a/de/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index ef2f6d56594..eecb84425f1 100644 --- a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 3537292a90c..ddded80bca1 100644 --- a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index d71563bc34d..61047a4819a 100644 --- a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index fe99486aa3e..6b841e93c54 100644 --- a/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/de/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/index.html b/de/docs/pre-release/farming-&-staking/index.html index a423ce3fd2c..ae2dd4c74eb 100644 --- a/de/docs/pre-release/farming-&-staking/index.html +++ b/de/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/staking/index.html b/de/docs/pre-release/farming-&-staking/staking/index.html index e176f3ecb67..56ed59a84a9 100644 --- a/de/docs/pre-release/farming-&-staking/staking/index.html +++ b/de/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/staking/intro/index.html b/de/docs/pre-release/farming-&-staking/staking/intro/index.html index ef8d59e58e0..d20fe9f28ff 100644 --- a/de/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/de/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/staking/operators/index.html b/de/docs/pre-release/farming-&-staking/staking/operators/index.html index 2e48359c771..2f16b0cfb67 100644 --- a/de/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/de/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/timekeeping/index.html b/de/docs/pre-release/farming-&-staking/timekeeping/index.html index 3db99cc7bda..35287da4876 100644 --- a/de/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/de/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/de/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 10935c14277..6c49932b773 100644 --- a/de/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/de/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/de/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/de/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index 040e911075e..dd45b5eb724 100644 --- a/de/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/de/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/de/docs/pre-release/learn/intro/index.html b/de/docs/pre-release/learn/intro/index.html index 5fb940e762d..0f6c4b0bb12 100644 --- a/de/docs/pre-release/learn/intro/index.html +++ b/de/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/de/docs/pre-release/learn/security/index.html b/de/docs/pre-release/learn/security/index.html index a191747f80b..394ce43a9ff 100644 --- a/de/docs/pre-release/learn/security/index.html +++ b/de/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/learn/subnomicon/index.html b/de/docs/pre-release/learn/subnomicon/index.html index f68173d8480..df5821e325b 100644 --- a/de/docs/pre-release/learn/subnomicon/index.html +++ b/de/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/de/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/de/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 25166988f67..587e3326ee7 100644 --- a/de/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/de/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/participate/contribute/index.html b/de/docs/pre-release/participate/contribute/index.html index d7e584a895f..f1fcfa77724 100644 --- a/de/docs/pre-release/participate/contribute/index.html +++ b/de/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/de/docs/pre-release/participate/index.html b/de/docs/pre-release/participate/index.html index defe1613706..05f558739af 100644 --- a/de/docs/pre-release/participate/index.html +++ b/de/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/de/docs/pre-release/participate/translate/index.html b/de/docs/pre-release/participate/translate/index.html index 96b03592078..ddae6843e68 100644 --- a/de/docs/pre-release/participate/translate/index.html +++ b/de/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/de/index.html b/de/index.html index 05fe50f4046..f1284db180d 100644 --- a/de/index.html +++ b/de/index.html @@ -7,13 +7,13 @@ - +

    Farm von Überall

    Verdienen Sie Belohnungen, indem Sie einen Landwirtschaftsknoten betreiben, indem Sie freie Festplattenkapazität zusagen. Keine teure Einrichtung oder Vorabkapital erforderlich.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/de/markdown-page/index.html b/de/markdown-page/index.html index b811904d200..830fd5e85d3 100644 --- a/de/markdown-page/index.html +++ b/de/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/additional-guides/index.html b/docs/category/additional-guides/index.html index d3c4adba8c0..efaca49210b 100644 --- a/docs/category/additional-guides/index.html +++ b/docs/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/advanced-cli/index.html b/docs/category/advanced-cli/index.html index e470727289a..9a5fb8fcf70 100644 --- a/docs/category/advanced-cli/index.html +++ b/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/develop-on-nova-evm-/index.html b/docs/category/develop-on-nova-evm-/index.html index c5d14e61adf..dcb5ca79e23 100644 --- a/docs/category/develop-on-nova-evm-/index.html +++ b/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/docs/category/develop/index.html b/docs/category/develop/index.html index 834bbff1e59..d3398524664 100644 --- a/docs/category/develop/index.html +++ b/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/farming/index.html b/docs/category/farming/index.html index 554e929bfe7..8a432cbf869 100644 --- a/docs/category/farming/index.html +++ b/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/learn/index.html b/docs/category/learn/index.html index 1ee5425dac2..79ab8982f00 100644 --- a/docs/category/learn/index.html +++ b/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/operators-and-nominators/index.html b/docs/category/operators-and-nominators/index.html index 2e46adc872f..acdeb8568f1 100644 --- a/docs/category/operators-and-nominators/index.html +++ b/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/participate/index.html b/docs/category/participate/index.html index 008734aea45..501be6259c0 100644 --- a/docs/category/participate/index.html +++ b/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/pulsar-recommended/index.html b/docs/category/pulsar-recommended/index.html index 9511c3d1def..662d41bbc3f 100644 --- a/docs/category/pulsar-recommended/index.html +++ b/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/category/wallets/index.html b/docs/category/wallets/index.html index 144d403e70f..a2962c7b246 100644 --- a/docs/category/wallets/index.html +++ b/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/develop/nova/block_explorer/index.html b/docs/develop/nova/block_explorer/index.html index a836c5ec902..5b5d7779be4 100644 --- a/docs/develop/nova/block_explorer/index.html +++ b/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/develop/nova/faucet/index.html b/docs/develop/nova/faucet/index.html index 4fe1b9bdb83..aab80d9be16 100644 --- a/docs/develop/nova/faucet/index.html +++ b/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/docs/develop/nova/foundry_guide/index.html b/docs/develop/nova/foundry_guide/index.html index 1c403dd99a3..48a659cb50a 100644 --- a/docs/develop/nova/foundry_guide/index.html +++ b/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/docs/develop/nova/general-information/index.html b/docs/develop/nova/general-information/index.html index 1d33422c8b2..cfc5b0035a9 100644 --- a/docs/develop/nova/general-information/index.html +++ b/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/docs/develop/nova/hardhat_guide/index.html b/docs/develop/nova/hardhat_guide/index.html index 462efa9e81e..adab08232e2 100644 --- a/docs/develop/nova/hardhat_guide/index.html +++ b/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/docs/develop/nova/intro/index.html b/docs/develop/nova/intro/index.html index 64d1c0060f9..a177ab44bc1 100644 --- a/docs/develop/nova/intro/index.html +++ b/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/docs/develop/nova/local_development/index.html b/docs/develop/nova/local_development/index.html index afc6f9455b9..27315c1fe9f 100644 --- a/docs/develop/nova/local_development/index.html +++ b/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/docs/develop/nova/quick_start/index.html b/docs/develop/nova/quick_start/index.html index 7a2c27dd3e0..bfa0134decb 100644 --- a/docs/develop/nova/quick_start/index.html +++ b/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/docs/develop/nova/remix_guide/index.html b/docs/develop/nova/remix_guide/index.html index 76d469ed5ce..bb2e6d8e582 100644 --- a/docs/develop/nova/remix_guide/index.html +++ b/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/docs/develop/nova/setting-up-metamask/index.html b/docs/develop/nova/setting-up-metamask/index.html index e4bddf4d537..0daea69b860 100644 --- a/docs/develop/nova/setting-up-metamask/index.html +++ b/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index c200d77b274..2a3398aaab8 100644 --- a/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index e7ef29adbcd..8699c3b1db0 100644 --- a/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index bbeb91dd31f..0647f33e78c 100644 --- a/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 48b9e9f1977..543ff574f17 100644 --- a/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 7a1c0060372..efd84f17bbe 100644 --- a/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/common_problems/index.html b/docs/farming-&-staking/farming/common_problems/index.html index 536a19e1a52..577ff2dd511 100644 --- a/docs/farming-&-staking/farming/common_problems/index.html +++ b/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 7f0dbaae743..069538c306e 100644 --- a/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index e363fe89493..07852cdbf9a 100644 --- a/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index b918ae2f211..5b9d16deedc 100644 --- a/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index a5cf0807934..01415912cf9 100644 --- a/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/index.html b/docs/farming-&-staking/index.html index 244d7c3c9f5..348441f332e 100644 --- a/docs/farming-&-staking/index.html +++ b/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/farming-&-staking/staking/index.html b/docs/farming-&-staking/staking/index.html index b03f9283daa..8937649bc3d 100644 --- a/docs/farming-&-staking/staking/index.html +++ b/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/staking/intro/index.html b/docs/farming-&-staking/staking/intro/index.html index 1897e2fb5aa..536ccc0f38f 100644 --- a/docs/farming-&-staking/staking/intro/index.html +++ b/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/staking/operators/index.html b/docs/farming-&-staking/staking/operators/index.html index 9fcfe2267dd..5634fbd916f 100644 --- a/docs/farming-&-staking/staking/operators/index.html +++ b/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/timekeeping/index.html b/docs/farming-&-staking/timekeeping/index.html index e7934df25aa..aa2b9488851 100644 --- a/docs/farming-&-staking/timekeeping/index.html +++ b/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/docs/farming-&-staking/wallets/polkadot/index.html b/docs/farming-&-staking/wallets/polkadot/index.html index 67693b23d12..8d4ad49dfb3 100644 --- a/docs/farming-&-staking/wallets/polkadot/index.html +++ b/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/docs/farming-&-staking/wallets/subwallet/index.html b/docs/farming-&-staking/wallets/subwallet/index.html index 838c5ccae8a..48f051e9794 100644 --- a/docs/farming-&-staking/wallets/subwallet/index.html +++ b/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/docs/learn/intro/index.html b/docs/learn/intro/index.html index a28abcbf895..8af354f5d49 100644 --- a/docs/learn/intro/index.html +++ b/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/docs/learn/security/index.html b/docs/learn/security/index.html index 6da6a9d7af2..cf35bab8656 100644 --- a/docs/learn/security/index.html +++ b/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/docs/learn/subnomicon/index.html b/docs/learn/subnomicon/index.html index 0a7f91b527d..9fc3f5bc98b 100644 --- a/docs/learn/subnomicon/index.html +++ b/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/docs/participate/CODE_OF_CONDUCT/index.html b/docs/participate/CODE_OF_CONDUCT/index.html index b47f2de2647..5f7d0408a35 100644 --- a/docs/participate/CODE_OF_CONDUCT/index.html +++ b/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/docs/participate/contribute/index.html b/docs/participate/contribute/index.html index 4111dc3a471..a2dce5ba54f 100644 --- a/docs/participate/contribute/index.html +++ b/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/docs/participate/index.html b/docs/participate/index.html index 6e3ebd0ffce..61f4bdeb8aa 100644 --- a/docs/participate/index.html +++ b/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/docs/participate/translate/index.html b/docs/participate/translate/index.html index eecff9bc616..a26c64bd827 100644 --- a/docs/participate/translate/index.html +++ b/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/docs/pre-release/category/additional-guides/index.html b/docs/pre-release/category/additional-guides/index.html index a532e8fb4a5..c0fea206438 100644 --- a/docs/pre-release/category/additional-guides/index.html +++ b/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/advanced-cli/index.html b/docs/pre-release/category/advanced-cli/index.html index f46c636f9a1..02787830a47 100644 --- a/docs/pre-release/category/advanced-cli/index.html +++ b/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/develop-on-nova-evm-/index.html b/docs/pre-release/category/develop-on-nova-evm-/index.html index 0aa45a94b37..003484908e6 100644 --- a/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/docs/pre-release/category/develop/index.html b/docs/pre-release/category/develop/index.html index ca68d624a5c..0db6c3f1d29 100644 --- a/docs/pre-release/category/develop/index.html +++ b/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/farming/index.html b/docs/pre-release/category/farming/index.html index ed2db454cf4..9e921dce19f 100644 --- a/docs/pre-release/category/farming/index.html +++ b/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/learn/index.html b/docs/pre-release/category/learn/index.html index f28b16d5652..16d704e9c8c 100644 --- a/docs/pre-release/category/learn/index.html +++ b/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/operators-and-nominators/index.html b/docs/pre-release/category/operators-and-nominators/index.html index ca38e486c90..81e6552dd4b 100644 --- a/docs/pre-release/category/operators-and-nominators/index.html +++ b/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/participate/index.html b/docs/pre-release/category/participate/index.html index b0373f31ef5..b7d527aebed 100644 --- a/docs/pre-release/category/participate/index.html +++ b/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/pulsar-recommended/index.html b/docs/pre-release/category/pulsar-recommended/index.html index ccffa2d0737..5446c4881f2 100644 --- a/docs/pre-release/category/pulsar-recommended/index.html +++ b/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/category/wallets/index.html b/docs/pre-release/category/wallets/index.html index 71dd4aa0e9e..426f32a544e 100644 --- a/docs/pre-release/category/wallets/index.html +++ b/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/block_explorer/index.html b/docs/pre-release/develop/nova/block_explorer/index.html index d789648228a..afdf0ef7aca 100644 --- a/docs/pre-release/develop/nova/block_explorer/index.html +++ b/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/faucet/index.html b/docs/pre-release/develop/nova/faucet/index.html index 49139511f11..3f13b88dda0 100644 --- a/docs/pre-release/develop/nova/faucet/index.html +++ b/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/foundry_guide/index.html b/docs/pre-release/develop/nova/foundry_guide/index.html index d776c095f46..f9ee66a9f1e 100644 --- a/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/general-information/index.html b/docs/pre-release/develop/nova/general-information/index.html index ce99cbdd262..9781bdb9e9b 100644 --- a/docs/pre-release/develop/nova/general-information/index.html +++ b/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/hardhat_guide/index.html b/docs/pre-release/develop/nova/hardhat_guide/index.html index 23e230f666c..9661b6c7d9e 100644 --- a/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/intro/index.html b/docs/pre-release/develop/nova/intro/index.html index 02423e2d4ce..fa4be9d480b 100644 --- a/docs/pre-release/develop/nova/intro/index.html +++ b/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/local_development/index.html b/docs/pre-release/develop/nova/local_development/index.html index 07a8dcde02b..621a62c19e0 100644 --- a/docs/pre-release/develop/nova/local_development/index.html +++ b/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/quick_start/index.html b/docs/pre-release/develop/nova/quick_start/index.html index df1437f7207..bfc6fbebcb4 100644 --- a/docs/pre-release/develop/nova/quick_start/index.html +++ b/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/remix_guide/index.html b/docs/pre-release/develop/nova/remix_guide/index.html index 621724db987..ff6bdcb1bdf 100644 --- a/docs/pre-release/develop/nova/remix_guide/index.html +++ b/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/docs/pre-release/develop/nova/setting-up-metamask/index.html b/docs/pre-release/develop/nova/setting-up-metamask/index.html index 11e02004b5e..51699ada068 100644 --- a/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 3025c550bdf..5c192d88c6c 100644 --- a/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 439fb7b7db7..c0616dec72c 100644 --- a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 71e4656c354..979643e0527 100644 --- a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 55ad9352677..2a9852fd3ed 100644 --- a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 2935e136ca9..343ee0695bf 100644 --- a/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/docs/pre-release/farming-&-staking/farming/common_problems/index.html index f07a898fede..ca4d580526d 100644 --- a/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 417f695c189..f27847cb9e5 100644 --- a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 72a2be0f2a7..2d944948640 100644 --- a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 66ed1022668..e72b59a51bf 100644 --- a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 56f0f6866be..d2585bb2d18 100644 --- a/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/index.html b/docs/pre-release/farming-&-staking/index.html index 3c40ec2f5ae..b24befae440 100644 --- a/docs/pre-release/farming-&-staking/index.html +++ b/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/staking/index.html b/docs/pre-release/farming-&-staking/staking/index.html index 844047393c9..ba82d2bff89 100644 --- a/docs/pre-release/farming-&-staking/staking/index.html +++ b/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/staking/intro/index.html b/docs/pre-release/farming-&-staking/staking/intro/index.html index 2c6bf4addd3..cd46d3dd612 100644 --- a/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/staking/operators/index.html b/docs/pre-release/farming-&-staking/staking/operators/index.html index 2ac5b2e4fe1..2c6ad20de24 100644 --- a/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/timekeeping/index.html b/docs/pre-release/farming-&-staking/timekeeping/index.html index 2bba53c41f3..be5aab57d96 100644 --- a/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 8bcf14f75cb..b6b35527f4a 100644 --- a/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index 83c95813cf9..79ad8480c05 100644 --- a/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/docs/pre-release/learn/intro/index.html b/docs/pre-release/learn/intro/index.html index 97971078991..735c6da34fd 100644 --- a/docs/pre-release/learn/intro/index.html +++ b/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/docs/pre-release/learn/security/index.html b/docs/pre-release/learn/security/index.html index 145cf1b006c..92ffadcbf24 100644 --- a/docs/pre-release/learn/security/index.html +++ b/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/docs/pre-release/learn/subnomicon/index.html b/docs/pre-release/learn/subnomicon/index.html index f083a7de814..8e194dee779 100644 --- a/docs/pre-release/learn/subnomicon/index.html +++ b/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 08972175e9c..e0efe4a9d00 100644 --- a/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/docs/pre-release/participate/contribute/index.html b/docs/pre-release/participate/contribute/index.html index 7ebcb2d33fe..45e4278a56d 100644 --- a/docs/pre-release/participate/contribute/index.html +++ b/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/docs/pre-release/participate/index.html b/docs/pre-release/participate/index.html index e0f5c82c828..be4266a2bd5 100644 --- a/docs/pre-release/participate/index.html +++ b/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/docs/pre-release/participate/translate/index.html b/docs/pre-release/participate/translate/index.html index 64a2bdfdeac..6d706f15535 100644 --- a/docs/pre-release/participate/translate/index.html +++ b/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/es/404.html b/es/404.html index 0a7b25805ad..2b3dbe79c76 100644 --- a/es/404.html +++ b/es/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/assets/js/11504b5c.bbe5a4a6.js b/es/assets/js/11504b5c.bbe5a4a6.js new file mode 100644 index 00000000000..1c10972d4bd --- /dev/null +++ b/es/assets/js/11504b5c.bbe5a4a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8952],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},712:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/es/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/es/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/es/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/es/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/es/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/es/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/es/assets/js/11504b5c.f261c58d.js b/es/assets/js/11504b5c.f261c58d.js deleted file mode 100644 index 1a52e350975..00000000000 --- a/es/assets/js/11504b5c.f261c58d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8952],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},712:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/es/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/es/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/es/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/es/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/es/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/es/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/es/assets/js/1361b2d7.21e1cd81.js b/es/assets/js/1361b2d7.21e1cd81.js deleted file mode 100644 index 6819c1af042..00000000000 --- a/es/assets/js/1361b2d7.21e1cd81.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[3980],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1933:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/es/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/es/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/es/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/es/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/es/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/es/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/es/assets/js/1361b2d7.e5b37d44.js b/es/assets/js/1361b2d7.e5b37d44.js new file mode 100644 index 00000000000..f79d8350ef4 --- /dev/null +++ b/es/assets/js/1361b2d7.e5b37d44.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[3980],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1933:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/es/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/es/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/es/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/es/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/es/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/es/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/es/assets/js/runtime~main.50e3ffca.js b/es/assets/js/runtime~main.23ecf86b.js similarity index 98% rename from es/assets/js/runtime~main.50e3ffca.js rename to es/assets/js/runtime~main.23ecf86b.js index 943099132fe..fbc9855b0b8 100644 --- a/es/assets/js/runtime~main.50e3ffca.js +++ b/es/assets/js/runtime~main.23ecf86b.js @@ -1 +1 @@ -(()=>{"use strict";var e,f,c,a,b,d={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(f,c,a,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,a,b]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};f=f||[null,c({}),c([]),c(c)];for(var t=2&a&&e;"object"==typeof t&&!~f.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((f=>d[f]=()=>e[f]));return d.default=()=>e,r.d(b,d),b},r.d=(e,f)=>{for(var c in f)r.o(f,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:f[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,c)=>(r.f[c](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",275:"bb2bdc1e",400:"78fe93b1",520:"573b21bf",746:"b6def7ea",785:"aefc239e",945:"ac353977",1130:"14775429",1361:"bbe9da00",1476:"72c3be8c",1560:"f515f95e",1637:"0e5ee057",1792:"30f2630a",1829:"0538dc5c",1864:"69d1cec5",2057:"eb999967",2210:"17712b5e",2386:"6bfd3e25",2480:"6fa92b38",2547:"d2190f93",2698:"e7ad4992",2774:"9c2ac179",2883:"9ee08f6a",2886:"b70e3ec9",2943:"b558bcd5",2963:"c9b27384",2984:"22b9bbc7",3085:"1f391b9e",3235:"da6f36cd",3237:"1df93b7f",3268:"600ca9b7",3280:"ef42b41f",3341:"f61ba1c9",3453:"63dca624",3546:"c6209d99",3581:"00f359f0",3669:"d0cdc083",3712:"4a677866",3908:"7857741c",3980:"1361b2d7",4041:"858a1305",4091:"bcda27fe",4244:"65f1da39",4448:"996ac3ca",4876:"19d6c6c9",4996:"b4c75055",5037:"bcc456e9",5106:"96daee82",5169:"be2b1e0f",5397:"f5f15c23",5510:"7922de17",5521:"1a292c6c",5531:"5af2a888",5539:"627f8fa8",5914:"a4513a02",6150:"ccb9868b",6272:"ae9476d9",6328:"9addfb15",6379:"c33db316",6454:"a6be503e",6474:"d6874fd4",6493:"4517fd14",6495:"7178f32b",6506:"212e6529",6761:"0973a9ba",6823:"382208cf",6932:"ad03778c",7069:"4971eec7",7180:"84452d7e",7269:"a3d853b3",7370:"c09f4ff7",7408:"0ec7230b",7414:"393be207",7442:"29b38e81",7538:"ce90de3f",7566:"42f8df5f",7590:"832e672b",7831:"16b8455a",7918:"17896441",7948:"7a8672c6",8126:"f571a160",8180:"2012bc5e",8344:"a221d1dd",8614:"7d234322",8707:"8433909d",8715:"279550c4",8935:"928251f1",8952:"11504b5c",8982:"d38d0077",9437:"9a3c73a0",9444:"948fe5f2",9514:"1be78505",9516:"ba05495b",9602:"f3b922f6",9623:"d05cdf73",9703:"ef1e286d",9750:"7c1b9360",9817:"14eb3368"}[e]||e)+"."+{53:"a45c5c83",275:"d44af2e2",400:"db415bb7",520:"3029d9db",746:"411bc2d1",785:"26c47a5a",814:"dc8c3a26",945:"9c59e2a0",1130:"6a31cb47",1361:"e94308e0",1476:"22309300",1560:"47ac3c1f",1637:"fe369708",1792:"8d1d9b57",1829:"e41540fa",1864:"b2d59c79",2057:"8bb6615d",2210:"0a49a71a",2386:"cbe13e0e",2480:"d0e849ac",2547:"85b84160",2698:"9824c607",2774:"97087b2e",2883:"02af0456",2886:"9cfba1b1",2943:"eb8d50b3",2963:"3bdaced4",2984:"6508cf92",3085:"3a447380",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3268:"c3ad2769",3280:"a28d7ef7",3341:"b65b995b",3453:"d785d17a",3473:"fdffa07c",3546:"ec1cec01",3581:"c0b866ea",3669:"58c865ca",3712:"b390b0ce",3908:"07999169",3980:"21e1cd81",4041:"d4830fb0",4091:"485cd604",4244:"170fd964",4448:"55fc9a47",4876:"c4dd560c",4972:"4a54fd4a",4996:"1b7c8f6e",5037:"535ae31f",5106:"a52d3ab5",5169:"e90e02a1",5397:"336bb507",5510:"a7f1368d",5521:"0bc8e6f9",5531:"7103bbb0",5539:"8b60f936",5914:"1a874d5c",6150:"70be4cfe",6272:"34e8fc5b",6328:"816487fc",6379:"7b612f33",6454:"ecbf3e56",6474:"3550246a",6493:"2ab2be24",6495:"6b37a6e0",6506:"d2f78a6d",6761:"92486f80",6823:"b0f79ed1",6932:"f8073afb",7069:"b19c3eac",7180:"cb03231b",7269:"315e4aa8",7370:"b21485da",7408:"0153da28",7414:"f1b1c72a",7442:"03b4e986",7538:"e0d3daf0",7566:"84a490f4",7590:"091bed71",7831:"9cf2c509",7918:"e3da5265",7948:"7d8d42c9",8126:"c8fc18db",8180:"ca4f76d1",8344:"2a7efc14",8614:"29535582",8707:"4d197c4f",8715:"9b12034f",8935:"9ad217c5",8952:"f261c58d",8982:"02629169",9437:"818b0403",9444:"c4948014",9514:"478c02c6",9516:"6ff78459",9602:"93122f71",9623:"d1e2b624",9703:"769a11cb",9750:"139a782b",9817:"b7ea7ab7"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),a={},b="portal:",r.l=(e,f,c,d)=>{if(a[e])a[e].push(f);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=a[e];if(delete a[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),f)return f(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/es/",r.gca=function(e){return e={14775429:"1130",17896441:"7918","935f2afb":"53",bb2bdc1e:"275","78fe93b1":"400","573b21bf":"520",b6def7ea:"746",aefc239e:"785",ac353977:"945",bbe9da00:"1361","72c3be8c":"1476",f515f95e:"1560","0e5ee057":"1637","30f2630a":"1792","0538dc5c":"1829","69d1cec5":"1864",eb999967:"2057","17712b5e":"2210","6bfd3e25":"2386","6fa92b38":"2480",d2190f93:"2547",e7ad4992:"2698","9c2ac179":"2774","9ee08f6a":"2883",b70e3ec9:"2886",b558bcd5:"2943",c9b27384:"2963","22b9bbc7":"2984","1f391b9e":"3085",da6f36cd:"3235","1df93b7f":"3237","600ca9b7":"3268",ef42b41f:"3280",f61ba1c9:"3341","63dca624":"3453",c6209d99:"3546","00f359f0":"3581",d0cdc083:"3669","4a677866":"3712","7857741c":"3908","1361b2d7":"3980","858a1305":"4041",bcda27fe:"4091","65f1da39":"4244","996ac3ca":"4448","19d6c6c9":"4876",b4c75055:"4996",bcc456e9:"5037","96daee82":"5106",be2b1e0f:"5169",f5f15c23:"5397","7922de17":"5510","1a292c6c":"5521","5af2a888":"5531","627f8fa8":"5539",a4513a02:"5914",ccb9868b:"6150",ae9476d9:"6272","9addfb15":"6328",c33db316:"6379",a6be503e:"6454",d6874fd4:"6474","4517fd14":"6493","7178f32b":"6495","212e6529":"6506","0973a9ba":"6761","382208cf":"6823",ad03778c:"6932","4971eec7":"7069","84452d7e":"7180",a3d853b3:"7269",c09f4ff7:"7370","0ec7230b":"7408","393be207":"7414","29b38e81":"7442",ce90de3f:"7538","42f8df5f":"7566","832e672b":"7590","16b8455a":"7831","7a8672c6":"7948",f571a160:"8126","2012bc5e":"8180",a221d1dd:"8344","7d234322":"8614","8433909d":"8707","279550c4":"8715","928251f1":"8935","11504b5c":"8952",d38d0077:"8982","9a3c73a0":"9437","948fe5f2":"9444","1be78505":"9514",ba05495b:"9516",f3b922f6:"9602",d05cdf73:"9623",ef1e286d:"9703","7c1b9360":"9750","14eb3368":"9817"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,c)=>{var a=r.o(e,f)?e[f]:void 0;if(0!==a)if(a)c.push(a[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var b=new Promise(((c,b)=>a=e[f]=[c,b]));c.push(a[2]=b);var d=r.p+r.u(f),t=new Error;r.l(d,(c=>{if(r.o(e,f)&&(0!==(a=e[f])&&(e[f]=void 0),a)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+f+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,a[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,c)=>{var a,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((f=>0!==e[f]))){for(a in t)r.o(t,a)&&(r.m[a]=t[a]);if(o)var i=o(r)}for(f&&f(c);n{"use strict";var e,f,c,a,b,d={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(f,c,a,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,a,b]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};f=f||[null,c({}),c([]),c(c)];for(var t=2&a&&e;"object"==typeof t&&!~f.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((f=>d[f]=()=>e[f]));return d.default=()=>e,r.d(b,d),b},r.d=(e,f)=>{for(var c in f)r.o(f,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:f[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,c)=>(r.f[c](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",275:"bb2bdc1e",400:"78fe93b1",520:"573b21bf",746:"b6def7ea",785:"aefc239e",945:"ac353977",1130:"14775429",1361:"bbe9da00",1476:"72c3be8c",1560:"f515f95e",1637:"0e5ee057",1792:"30f2630a",1829:"0538dc5c",1864:"69d1cec5",2057:"eb999967",2210:"17712b5e",2386:"6bfd3e25",2480:"6fa92b38",2547:"d2190f93",2698:"e7ad4992",2774:"9c2ac179",2883:"9ee08f6a",2886:"b70e3ec9",2943:"b558bcd5",2963:"c9b27384",2984:"22b9bbc7",3085:"1f391b9e",3235:"da6f36cd",3237:"1df93b7f",3268:"600ca9b7",3280:"ef42b41f",3341:"f61ba1c9",3453:"63dca624",3546:"c6209d99",3581:"00f359f0",3669:"d0cdc083",3712:"4a677866",3908:"7857741c",3980:"1361b2d7",4041:"858a1305",4091:"bcda27fe",4244:"65f1da39",4448:"996ac3ca",4876:"19d6c6c9",4996:"b4c75055",5037:"bcc456e9",5106:"96daee82",5169:"be2b1e0f",5397:"f5f15c23",5510:"7922de17",5521:"1a292c6c",5531:"5af2a888",5539:"627f8fa8",5914:"a4513a02",6150:"ccb9868b",6272:"ae9476d9",6328:"9addfb15",6379:"c33db316",6454:"a6be503e",6474:"d6874fd4",6493:"4517fd14",6495:"7178f32b",6506:"212e6529",6761:"0973a9ba",6823:"382208cf",6932:"ad03778c",7069:"4971eec7",7180:"84452d7e",7269:"a3d853b3",7370:"c09f4ff7",7408:"0ec7230b",7414:"393be207",7442:"29b38e81",7538:"ce90de3f",7566:"42f8df5f",7590:"832e672b",7831:"16b8455a",7918:"17896441",7948:"7a8672c6",8126:"f571a160",8180:"2012bc5e",8344:"a221d1dd",8614:"7d234322",8707:"8433909d",8715:"279550c4",8935:"928251f1",8952:"11504b5c",8982:"d38d0077",9437:"9a3c73a0",9444:"948fe5f2",9514:"1be78505",9516:"ba05495b",9602:"f3b922f6",9623:"d05cdf73",9703:"ef1e286d",9750:"7c1b9360",9817:"14eb3368"}[e]||e)+"."+{53:"a45c5c83",275:"d44af2e2",400:"db415bb7",520:"3029d9db",746:"411bc2d1",785:"26c47a5a",814:"dc8c3a26",945:"9c59e2a0",1130:"6a31cb47",1361:"e94308e0",1476:"22309300",1560:"47ac3c1f",1637:"fe369708",1792:"8d1d9b57",1829:"e41540fa",1864:"b2d59c79",2057:"8bb6615d",2210:"0a49a71a",2386:"cbe13e0e",2480:"d0e849ac",2547:"85b84160",2698:"9824c607",2774:"97087b2e",2883:"02af0456",2886:"9cfba1b1",2943:"eb8d50b3",2963:"3bdaced4",2984:"6508cf92",3085:"3a447380",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3268:"c3ad2769",3280:"a28d7ef7",3341:"b65b995b",3453:"d785d17a",3473:"fdffa07c",3546:"ec1cec01",3581:"c0b866ea",3669:"58c865ca",3712:"b390b0ce",3908:"07999169",3980:"e5b37d44",4041:"d4830fb0",4091:"485cd604",4244:"170fd964",4448:"55fc9a47",4876:"c4dd560c",4972:"4a54fd4a",4996:"1b7c8f6e",5037:"535ae31f",5106:"a52d3ab5",5169:"e90e02a1",5397:"336bb507",5510:"a7f1368d",5521:"0bc8e6f9",5531:"7103bbb0",5539:"8b60f936",5914:"1a874d5c",6150:"70be4cfe",6272:"34e8fc5b",6328:"816487fc",6379:"7b612f33",6454:"ecbf3e56",6474:"3550246a",6493:"2ab2be24",6495:"6b37a6e0",6506:"d2f78a6d",6761:"92486f80",6823:"b0f79ed1",6932:"f8073afb",7069:"b19c3eac",7180:"cb03231b",7269:"315e4aa8",7370:"b21485da",7408:"0153da28",7414:"f1b1c72a",7442:"03b4e986",7538:"e0d3daf0",7566:"84a490f4",7590:"091bed71",7831:"9cf2c509",7918:"e3da5265",7948:"7d8d42c9",8126:"c8fc18db",8180:"ca4f76d1",8344:"2a7efc14",8614:"29535582",8707:"4d197c4f",8715:"9b12034f",8935:"9ad217c5",8952:"bbe5a4a6",8982:"02629169",9437:"818b0403",9444:"c4948014",9514:"478c02c6",9516:"6ff78459",9602:"93122f71",9623:"d1e2b624",9703:"769a11cb",9750:"139a782b",9817:"b7ea7ab7"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),a={},b="portal:",r.l=(e,f,c,d)=>{if(a[e])a[e].push(f);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=a[e];if(delete a[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(c))),f)return f(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/es/",r.gca=function(e){return e={14775429:"1130",17896441:"7918","935f2afb":"53",bb2bdc1e:"275","78fe93b1":"400","573b21bf":"520",b6def7ea:"746",aefc239e:"785",ac353977:"945",bbe9da00:"1361","72c3be8c":"1476",f515f95e:"1560","0e5ee057":"1637","30f2630a":"1792","0538dc5c":"1829","69d1cec5":"1864",eb999967:"2057","17712b5e":"2210","6bfd3e25":"2386","6fa92b38":"2480",d2190f93:"2547",e7ad4992:"2698","9c2ac179":"2774","9ee08f6a":"2883",b70e3ec9:"2886",b558bcd5:"2943",c9b27384:"2963","22b9bbc7":"2984","1f391b9e":"3085",da6f36cd:"3235","1df93b7f":"3237","600ca9b7":"3268",ef42b41f:"3280",f61ba1c9:"3341","63dca624":"3453",c6209d99:"3546","00f359f0":"3581",d0cdc083:"3669","4a677866":"3712","7857741c":"3908","1361b2d7":"3980","858a1305":"4041",bcda27fe:"4091","65f1da39":"4244","996ac3ca":"4448","19d6c6c9":"4876",b4c75055:"4996",bcc456e9:"5037","96daee82":"5106",be2b1e0f:"5169",f5f15c23:"5397","7922de17":"5510","1a292c6c":"5521","5af2a888":"5531","627f8fa8":"5539",a4513a02:"5914",ccb9868b:"6150",ae9476d9:"6272","9addfb15":"6328",c33db316:"6379",a6be503e:"6454",d6874fd4:"6474","4517fd14":"6493","7178f32b":"6495","212e6529":"6506","0973a9ba":"6761","382208cf":"6823",ad03778c:"6932","4971eec7":"7069","84452d7e":"7180",a3d853b3:"7269",c09f4ff7:"7370","0ec7230b":"7408","393be207":"7414","29b38e81":"7442",ce90de3f:"7538","42f8df5f":"7566","832e672b":"7590","16b8455a":"7831","7a8672c6":"7948",f571a160:"8126","2012bc5e":"8180",a221d1dd:"8344","7d234322":"8614","8433909d":"8707","279550c4":"8715","928251f1":"8935","11504b5c":"8952",d38d0077:"8982","9a3c73a0":"9437","948fe5f2":"9444","1be78505":"9514",ba05495b:"9516",f3b922f6:"9602",d05cdf73:"9623",ef1e286d:"9703","7c1b9360":"9750","14eb3368":"9817"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,c)=>{var a=r.o(e,f)?e[f]:void 0;if(0!==a)if(a)c.push(a[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var b=new Promise(((c,b)=>a=e[f]=[c,b]));c.push(a[2]=b);var d=r.p+r.u(f),t=new Error;r.l(d,(c=>{if(r.o(e,f)&&(0!==(a=e[f])&&(e[f]=void 0),a)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;t.message="Loading chunk "+f+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,a[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,c)=>{var a,b,d=c[0],t=c[1],o=c[2],n=0;if(d.some((f=>0!==e[f]))){for(a in t)r.o(t,a)&&(r.m[a]=t[a]);if(o)var i=o(r)}for(f&&f(c);n - + - + \ No newline at end of file diff --git a/es/docs/category/advanced-cli/index.html b/es/docs/category/advanced-cli/index.html index c49d831c6d0..68525460399 100644 --- a/es/docs/category/advanced-cli/index.html +++ b/es/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/category/develop-on-nova-evm-/index.html b/es/docs/category/develop-on-nova-evm-/index.html index 46b9267d59c..3fcf491fe7c 100644 --- a/es/docs/category/develop-on-nova-evm-/index.html +++ b/es/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/es/docs/category/develop/index.html b/es/docs/category/develop/index.html index b3a4168d927..994da69cbb9 100644 --- a/es/docs/category/develop/index.html +++ b/es/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/category/farming/index.html b/es/docs/category/farming/index.html index 563c89abfc1..90e0ae0ab63 100644 --- a/es/docs/category/farming/index.html +++ b/es/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/category/learn/index.html b/es/docs/category/learn/index.html index fc7fbfbf287..b3324295b32 100644 --- a/es/docs/category/learn/index.html +++ b/es/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/category/operators-and-nominators/index.html b/es/docs/category/operators-and-nominators/index.html index b4dc4fed099..daab16559cd 100644 --- a/es/docs/category/operators-and-nominators/index.html +++ b/es/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/category/participate/index.html b/es/docs/category/participate/index.html index c8e06c3f0c4..c6fd156c57a 100644 --- a/es/docs/category/participate/index.html +++ b/es/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/category/pulsar-recommended/index.html b/es/docs/category/pulsar-recommended/index.html index 6bdc6e0e01c..bbd4cb117dc 100644 --- a/es/docs/category/pulsar-recommended/index.html +++ b/es/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/category/wallets/index.html b/es/docs/category/wallets/index.html index 7d906699b56..06a70bd3ac1 100644 --- a/es/docs/category/wallets/index.html +++ b/es/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/develop/nova/block_explorer/index.html b/es/docs/develop/nova/block_explorer/index.html index d8e16015d70..bf7cb187648 100644 --- a/es/docs/develop/nova/block_explorer/index.html +++ b/es/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/develop/nova/faucet/index.html b/es/docs/develop/nova/faucet/index.html index a4755fa09bf..88a8826a2f3 100644 --- a/es/docs/develop/nova/faucet/index.html +++ b/es/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/es/docs/develop/nova/foundry_guide/index.html b/es/docs/develop/nova/foundry_guide/index.html index b8bc064a846..cb747e8f9ae 100644 --- a/es/docs/develop/nova/foundry_guide/index.html +++ b/es/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/es/docs/develop/nova/general-information/index.html b/es/docs/develop/nova/general-information/index.html index af400780af9..aedba3e544a 100644 --- a/es/docs/develop/nova/general-information/index.html +++ b/es/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/es/docs/develop/nova/hardhat_guide/index.html b/es/docs/develop/nova/hardhat_guide/index.html index cf1810c8d19..6614383d8c9 100644 --- a/es/docs/develop/nova/hardhat_guide/index.html +++ b/es/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/es/docs/develop/nova/intro/index.html b/es/docs/develop/nova/intro/index.html index 4e264cec5bc..0a6cd586dd4 100644 --- a/es/docs/develop/nova/intro/index.html +++ b/es/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/es/docs/develop/nova/local_development/index.html b/es/docs/develop/nova/local_development/index.html index 1effd8cf3bb..0b822a8be17 100644 --- a/es/docs/develop/nova/local_development/index.html +++ b/es/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/es/docs/develop/nova/quick_start/index.html b/es/docs/develop/nova/quick_start/index.html index 9c032b2e643..581a32eda64 100644 --- a/es/docs/develop/nova/quick_start/index.html +++ b/es/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/es/docs/develop/nova/remix_guide/index.html b/es/docs/develop/nova/remix_guide/index.html index a91f90e4d5b..0cb128ff1a7 100644 --- a/es/docs/develop/nova/remix_guide/index.html +++ b/es/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/es/docs/develop/nova/setting-up-metamask/index.html b/es/docs/develop/nova/setting-up-metamask/index.html index 40484120bb7..056d9c2660e 100644 --- a/es/docs/develop/nova/setting-up-metamask/index.html +++ b/es/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/es/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 57c58dc12ba..bee9ba4e4ea 100644 --- a/es/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/es/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. Aparecerá la dirección IP de tu router en la parte superior
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Encontrar la dirección IP del router en Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Encontrar la dirección IP del router en OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. Esto mostrará la dirección IP de su router doméstico
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/es/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 8abd4f84787..6c63e2db9ea 100644 --- a/es/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/es/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/es/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 0b34bef1afe..f0ed1838472 100644 --- a/es/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/es/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Requisitos previos

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/es/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 586df477763..1fffad3b65b 100644 --- a/es/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/es/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/es/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 4f01b2edd57..c2851f34ebc 100644 --- a/es/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/es/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Solución de problemas

    Solución de problemas

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/common_problems/index.html b/es/docs/farming-&-staking/farming/common_problems/index.html index 367a15e970b..3ed14f95f26 100644 --- a/es/docs/farming-&-staking/farming/common_problems/index.html +++ b/es/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Problemas habituales

    Aunque Subspace se esfuerza por publicar software libre de errores, los usuarios pueden encontrarse con ciertos errores. Algunos de ellos pueden ignorarse sin peligro, mientras que otros requieren atención.

    Problemas comunes y formas de resolverlos

    Error al marcar la telemetría del dns

    Error al marcar /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Personalizado { kind: Otro, error: Timeout }

    Este error está relacionado sólo con el servidor de telemetría. Es algo que puede ocurrir ocasionalmente, pero que no afecta al farming. Puedes ignorarlo sin problemas.

    Farmer atascado en el trazado, no avanza en varias horas

    Prueba a reiniciar tu nodo o farmer. Hemos observado que a veces, al crear parcelas más grandes, puede parecer que el proceso se detiene, pero continúa automáticamente al cabo de un tiempo.

    Instrucción ilegal (core dumped)

    Este error está causado por CPUs antiguas sin el soporte de instrucciones necesario (por ejemplo, ADX 4). Puede solucionarse compilando el software desde el código fuente en esa máquina.

    Aunque los procesadores sin instrucciones ADX son compatibles, su rendimiento se verá afectado significativamente en comparación con los procesadores que sí admiten instrucciones ADX.

    La mayoría de los procesadores de sobremesa modernos a partir de Broadwell por parte de Intel y Ryzen (ZEN 1) por parte de AMD sí soportan las instrucciones ADX necesarias y no deberían verse afectados por el error.

    No hay recompensas tras varios días de farming

    Por favor, asegúrese de que:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Fallo en la recuperación de la pieza perdida

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    No se trata de un error crucial y puede ignorarse.

    Error al importar el consenso de bloques

    Error al importar el bloque "número_bloque", error de consenso: Error de importación: Base de datos

    Es probable que tu PC se haya quedado sin espacio. Considere la posibilidad de liberar espacio eliminando archivos innecesarios y vuelva a intentarlo. Alternativamente, puede ajustar la cantidad de parcela para que coincida con el espacio disponible en disco

    No se puede crear el bloque en la ranura. No hay mejor cabecera de bloque

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Es probable que tu PC se haya quedado sin espacio. Considere la posibilidad de liberar espacio eliminando archivos innecesarios y vuelva a intentarlo. Alternativamente, puede ajustar la cantidad de parcela para que coincida con el espacio disponible en disco

    La sincronización rápida de nodos (más de 100 bloques por segundo) sólo llega hasta ±20.000 bloques, después la velocidad de sincronización disminuye considerablemente.

    A medida que aumente el tamaño de la base de datos y los bloques se hagan más grandes (ya que los agricultores empezaron a producir votos), se espera que la velocidad de sincronización se establezca en un número menor. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    Esto no es un error sino más bien una advertencia, es algo de esperar en una Red de Almacenamiento Descentralizada. No hay nada que tengas que hacer como usuario con este aviso, es probable que aparezca de vez en cuando pero mientras no haya otros errores más catastróficos se puede ignorar.

    Error al construir un farmer: existe el archivo

    0: Error al crear un farmer
    1: Error de creación de parcela de disco único: Error de E/S: El archivo existe (os error 17)
    2: Error de E/S: El fichero existe (os error 17)
    3: El archivo existe (os error 17)

    El sistema detecta una instalación preexistente. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Error de importación de bloque: Ataque potencial de largo alcance: bloque no en cadena finalizada.

    WARN sc_service::client::client: Error de importación del bloque: ataque de largo alcance Potential: bloque que no está en cadena finalizada.

    El nodo de alguna manera terminó siendo en un tenedor, trate de limpiar y empezar de cero.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/es/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 76926208ecc..e6688d9fd00 100644 --- a/es/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/es/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/es/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 3189bea67fd..9db4d3ec6cd 100644 --- a/es/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/es/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Requisitos previos

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/es/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 2293f0088f4..4f09e46327f 100644 --- a/es/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/es/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/es/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 1ab96eb6cb0..eadce08d19b 100644 --- a/es/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/es/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Solución de problemas

    Solución de problemas

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/index.html b/es/docs/farming-&-staking/index.html index 0a35f1bf3ee..cf75cf8a84d 100644 --- a/es/docs/farming-&-staking/index.html +++ b/es/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/staking/index.html b/es/docs/farming-&-staking/staking/index.html index d61d644a7f4..382b6d266a2 100644 --- a/es/docs/farming-&-staking/staking/index.html +++ b/es/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/staking/intro/index.html b/es/docs/farming-&-staking/staking/intro/index.html index 7058fd86959..be202ca632e 100644 --- a/es/docs/farming-&-staking/staking/intro/index.html +++ b/es/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/staking/operators/index.html b/es/docs/farming-&-staking/staking/operators/index.html index 7c8d04e04d3..a5532c70463 100644 --- a/es/docs/farming-&-staking/staking/operators/index.html +++ b/es/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/timekeeping/index.html b/es/docs/farming-&-staking/timekeeping/index.html index 23a963745c5..b08cb384f0f 100644 --- a/es/docs/farming-&-staking/timekeeping/index.html +++ b/es/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/wallets/polkadot/index.html b/es/docs/farming-&-staking/wallets/polkadot/index.html index c9a8beb20c3..75b2921bdf6 100644 --- a/es/docs/farming-&-staking/wallets/polkadot/index.html +++ b/es/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    Esta es la cartera de barebones. Esto se debe a que es la cartera de Substrate de barebones que soporta todas las redes basadas en Substrate. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Crear un nuevo monedero

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. La extensión te mostrará tu semilla de mnemónica de 12 palabras.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Una vez que su semilla esté guardada y guardada de forma segura, haga clic en la casilla de verificación “He guardado mi semilla con seguridad” y haga clic en “Siguiente paso”

    2. The next step will ask for a Name & Password for the wallet. luego haga clic en "Añadir la cuenta con la semilla generada"

      step-6

    3. ¡Felicidades ha creado una cartera de polkadot.js!

      step-7

    Importar una semilla existente

    Algunos usuarios pueden ser provistos de una frase de semilla mnemónica existente que puede haber sido proporcionada por Subspace-Desktop, si este es el caso que querrá seguir esta parte de la guía.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Solución de problemas

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    ¿Cómo puedo encontrar mi dirección pública?

    • Puede ver su dirección pública por defecto de sustrato justo debajo de su nombre de cartera dentro de la extensión

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • Como se ve a continuación, a veces cuando instala o actualiza por primera vez la cartera Substrate necesitará actualizar los metadatos del monedero.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    ¿Cómo puedo hacer una copia de seguridad de mi cartera?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/es/docs/farming-&-staking/wallets/subwallet/index.html b/es/docs/farming-&-staking/wallets/subwallet/index.html index b026edad0f7..16f501772c2 100644 --- a/es/docs/farming-&-staking/wallets/subwallet/index.html +++ b/es/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • URL de proveedor
    • Nombre de la red
    • Símbolo
    • Explorador de bloques
    • Crowdloan URL The only option that is required is the Provider URL. Puedes añadir un explorador si lo deseas, pero no es necesario. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Rellena la URL del proveedor, una vez que haga clic en esta casilla, marcará la URL y agregará el resto de la información, luego haga clic en Guardar.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Solución de problemas

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    ¿Cómo puedo hacer una copia de seguridad de mi cartera?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/es/docs/learn/intro/index.html b/es/docs/learn/intro/index.html index 362308b3c31..71a5a8712cf 100644 --- a/es/docs/learn/intro/index.html +++ b/es/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/es/docs/learn/security/index.html b/es/docs/learn/security/index.html index 509c9ba7ae8..6f052995d7f 100644 --- a/es/docs/learn/security/index.html +++ b/es/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/es/docs/learn/subnomicon/index.html b/es/docs/learn/subnomicon/index.html index 5002c6d7cfd..6b4546e72ee 100644 --- a/es/docs/learn/subnomicon/index.html +++ b/es/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/es/docs/participate/CODE_OF_CONDUCT/index.html b/es/docs/participate/CODE_OF_CONDUCT/index.html index 5d3e3d34178..ecfe760abf8 100644 --- a/es/docs/participate/CODE_OF_CONDUCT/index.html +++ b/es/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -41,7 +41,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/es/docs/participate/contribute/index.html b/es/docs/participate/contribute/index.html index ca049c7454c..c55a2d1b7e9 100644 --- a/es/docs/participate/contribute/index.html +++ b/es/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Echa un vistazo a algunas de estas guías increíbles para ayudarte a familiarizarte con GitHub y contribuir.

    Arreglo avanzado

    Esta sección presupone una mejor comprensión de GitHub, y de los conceptos básicos de programación.

    Para arreglos más grandes y más avanzados, por favor asegúrese de seguir los principios básicos a continuación.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Haga comentarios sobre el código no trivial complejo, la lógica compleja debería ser fácil de entender.
    • Todas las funciones públicas deben ser comentadas.
    • Si el código es trivial pero puede ser olvidado con el tiempo, por favor comente.
    • Intenta pensar en tu código desde una vista de tercera persona. debería tener sentido para cualquier persona con un fondo similar en la tecnología que está utilizando.
    • A veces es difícil de entender el código necesita refactorizar en lugar de más comentarios.
    • Asegúrese de que el programa todavía puede construir antes de pull request.

    Para las correcciones avanzadas debes seguir la vía general de GitHub.

    1. Create your own fork of the code. Fork
    2. Haga los cambios localmente en su sistema en su entorno de desarrollo preferido.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    Cómo reportar un error o error

    No tenemos ninguna plantilla estricta que usted debe seguir, pero por favor proporcione toda la información requerida para que podamos resolver rápidamente cualquier problema.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    Cómo sugerir una característica o mejora

    Esta documentación es para la comunidad, por lo que cualquier petición de característica es bienvenida.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explique por qué es necesario este problema y qué problemas resolverá.
    • Indique si está capacitado o dispuesto a ayudar a implementar esta función.

    Proceso de revisión de código

    • El equipo central echará un vistazo a cualquier pull request tan pronto como sea posible, generalmente puede esperar una respuesta dentro de uno o dos días.
    • Si se trata de una solución simple y no polémica, revisaremos el código y aprobaremos.
    • Si hay preguntas, comentarios, o más discusión debe ser si nos comunicamos con el colaborador de la Pull Request para intentar resolver dichos problemas.
    • Si no hay respuesta o actividad dentro de las dos semanas siguientes a la respuesta del equipo, podemos cerrar la solicitud de extracción.

    Comunidad

    Puedes chatear con el equipo central en Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/es/docs/participate/index.html b/es/docs/participate/index.html index 0b64a58f25a..ef3eff193fa 100644 --- a/es/docs/participate/index.html +++ b/es/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Increíble Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articulos

    Información

    Preguntas Más Frecuentes

    Comenzando la agricultura

    Medium

    Guía de inicio

    Traer el consenso de PoC a Substrate

    Subspace es el primer protocolo para resolver completamente el trilema del blockchain sin compromiso. proporcionado por solgas

    Eventos

    1er AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/es/docs/participate/translate/index.html b/es/docs/participate/translate/index.html index f55ff7090a3..564928447cd 100644 --- a/es/docs/participate/translate/index.html +++ b/es/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Guía de traducción

    Guía de traducción

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Requisitos previos

    Lineamientos

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    Cómo hacer

    A continuación encontrará el itinerario sobre cómo proporcionar traducciones para la red de subspace a través del portal de traducción de Crowdin.

    1. Visita el respectivo portal de traducción para el que quieres ayudar a traducir (Ver arriba)

      translate-step-1

    2. Una vez que haya iniciado sesión y se haya unido al proyecto, se le llevará al panel de control del proyecto, seleccione el idioma que desea traducir. Ver a continuación

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. Luego se te introducirá en el Portal de Traducción, en este portal encontrarás lo siguiente

      1. Versión en inglés del texto
      2. Marcar para introducir la traducción del idioma del texto en blanco
      3. Sugerencias automatizadas para el texto
      4. Lista de palabras que necesita traducir
      5. Un lugar para comentarios si algo necesita aclaración

      translate-step-4

    5. Desde aquí completarás tus traducciones como quieras y finalizarás una vez hayas terminado.

    6. Su traducción será revisada y aprobada en el momento oportuno. tenga en cuenta que las traducciones pueden tardar un par de días antes de que se llenen en la documentación desplegada.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/category/additional-guides/index.html b/es/docs/pre-release/category/additional-guides/index.html index 5136d218a8e..dfe9a808fbc 100644 --- a/es/docs/pre-release/category/additional-guides/index.html +++ b/es/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/advanced-cli/index.html b/es/docs/pre-release/category/advanced-cli/index.html index 1617cf09329..029597b9b41 100644 --- a/es/docs/pre-release/category/advanced-cli/index.html +++ b/es/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/develop-on-nova-evm-/index.html b/es/docs/pre-release/category/develop-on-nova-evm-/index.html index 20660f7dbe5..7c82a36eeb3 100644 --- a/es/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/es/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/es/docs/pre-release/category/develop/index.html b/es/docs/pre-release/category/develop/index.html index 7eb83eee835..c185696839e 100644 --- a/es/docs/pre-release/category/develop/index.html +++ b/es/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/farming/index.html b/es/docs/pre-release/category/farming/index.html index e8163fa87ab..bddd49d1769 100644 --- a/es/docs/pre-release/category/farming/index.html +++ b/es/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/learn/index.html b/es/docs/pre-release/category/learn/index.html index db02c41d84e..93f2e8a739f 100644 --- a/es/docs/pre-release/category/learn/index.html +++ b/es/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/operators-and-nominators/index.html b/es/docs/pre-release/category/operators-and-nominators/index.html index 4537f35bba1..5cd2697027b 100644 --- a/es/docs/pre-release/category/operators-and-nominators/index.html +++ b/es/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/participate/index.html b/es/docs/pre-release/category/participate/index.html index 3a13330cf14..8da518e9da6 100644 --- a/es/docs/pre-release/category/participate/index.html +++ b/es/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/pulsar-recommended/index.html b/es/docs/pre-release/category/pulsar-recommended/index.html index 8ebf3a0ddef..e8d172de490 100644 --- a/es/docs/pre-release/category/pulsar-recommended/index.html +++ b/es/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/category/wallets/index.html b/es/docs/pre-release/category/wallets/index.html index e7ff8657bc7..3aa30c3adc5 100644 --- a/es/docs/pre-release/category/wallets/index.html +++ b/es/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/block_explorer/index.html b/es/docs/pre-release/develop/nova/block_explorer/index.html index 572d6a1fd9d..88316e5e3f9 100644 --- a/es/docs/pre-release/develop/nova/block_explorer/index.html +++ b/es/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/faucet/index.html b/es/docs/pre-release/develop/nova/faucet/index.html index e520b927d8b..3675d0b50d9 100644 --- a/es/docs/pre-release/develop/nova/faucet/index.html +++ b/es/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/foundry_guide/index.html b/es/docs/pre-release/develop/nova/foundry_guide/index.html index 365c096c739..19d180f3f21 100644 --- a/es/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/es/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/general-information/index.html b/es/docs/pre-release/develop/nova/general-information/index.html index 783ab12c2cc..0342d9cf29a 100644 --- a/es/docs/pre-release/develop/nova/general-information/index.html +++ b/es/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/hardhat_guide/index.html b/es/docs/pre-release/develop/nova/hardhat_guide/index.html index 5d54029f5d4..8d4a41cbcd7 100644 --- a/es/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/es/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/intro/index.html b/es/docs/pre-release/develop/nova/intro/index.html index ef51c3dbf05..42cc0cde296 100644 --- a/es/docs/pre-release/develop/nova/intro/index.html +++ b/es/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/local_development/index.html b/es/docs/pre-release/develop/nova/local_development/index.html index f5993e523b9..b73f8c1aaf6 100644 --- a/es/docs/pre-release/develop/nova/local_development/index.html +++ b/es/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/quick_start/index.html b/es/docs/pre-release/develop/nova/quick_start/index.html index 528fdb8ae07..cd84a42093b 100644 --- a/es/docs/pre-release/develop/nova/quick_start/index.html +++ b/es/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/remix_guide/index.html b/es/docs/pre-release/develop/nova/remix_guide/index.html index 6a3d4800982..6a5490ca53c 100644 --- a/es/docs/pre-release/develop/nova/remix_guide/index.html +++ b/es/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/es/docs/pre-release/develop/nova/setting-up-metamask/index.html b/es/docs/pre-release/develop/nova/setting-up-metamask/index.html index 012eb8cf35a..5f5138943d7 100644 --- a/es/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/es/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/es/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 9a8b3a7e803..70bccb3dbc7 100644 --- a/es/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. Aparecerá la dirección IP de tu router en la parte superior
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Encontrar la dirección IP del router en Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Encontrar la dirección IP del router en OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. Esto mostrará la dirección IP de su router doméstico
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index d4ad5b9d478..1b235aac187 100644 --- a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 803dc4f0f50..a12851a2550 100644 --- a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Requisitos previos

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 1e8041571da..69ace364565 100644 --- a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 6060a797a58..30275ae77fd 100644 --- a/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Solución de problemas

    Solución de problemas

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/es/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 18923f3fcca..e9cc4777af7 100644 --- a/es/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Problemas habituales

    Aunque Subspace se esfuerza por publicar software libre de errores, los usuarios pueden encontrarse con ciertos errores. Algunos de ellos pueden ignorarse sin peligro, mientras que otros requieren atención.

    Problemas comunes y formas de resolverlos

    Error al marcar la telemetría del dns

    Error al marcar /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Personalizado { kind: Otro, error: Timeout }

    Este error está relacionado sólo con el servidor de telemetría. Es algo que puede ocurrir ocasionalmente, pero que no afecta al farming. Puedes ignorarlo sin problemas.

    Farmer atascado en el trazado, no avanza en varias horas

    Prueba a reiniciar tu nodo o farmer. Hemos observado que a veces, al crear parcelas más grandes, puede parecer que el proceso se detiene, pero continúa automáticamente al cabo de un tiempo.

    Instrucción ilegal (core dumped)

    Este error está causado por CPUs antiguas sin el soporte de instrucciones necesario (por ejemplo, ADX 4). Puede solucionarse compilando el software desde el código fuente en esa máquina.

    Aunque los procesadores sin instrucciones ADX son compatibles, su rendimiento se verá afectado significativamente en comparación con los procesadores que sí admiten instrucciones ADX.

    La mayoría de los procesadores de sobremesa modernos a partir de Broadwell por parte de Intel y Ryzen (ZEN 1) por parte de AMD sí soportan las instrucciones ADX necesarias y no deberían verse afectados por el error.

    No hay recompensas tras varios días de farming

    Por favor, asegúrese de que:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Fallo en la recuperación de la pieza perdida

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    No se trata de un error crucial y puede ignorarse.

    Error al importar el consenso de bloques

    Error al importar el bloque "número_bloque", error de consenso: Error de importación: Base de datos

    Es probable que tu PC se haya quedado sin espacio. Considere la posibilidad de liberar espacio eliminando archivos innecesarios y vuelva a intentarlo. Alternativamente, puede ajustar la cantidad de parcela para que coincida con el espacio disponible en disco

    No se puede crear el bloque en la ranura. No hay mejor cabecera de bloque

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Es probable que tu PC se haya quedado sin espacio. Considere la posibilidad de liberar espacio eliminando archivos innecesarios y vuelva a intentarlo. Alternativamente, puede ajustar la cantidad de parcela para que coincida con el espacio disponible en disco

    La sincronización rápida de nodos (más de 100 bloques por segundo) sólo llega hasta ±20.000 bloques, después la velocidad de sincronización disminuye considerablemente.

    A medida que aumente el tamaño de la base de datos y los bloques se hagan más grandes (ya que los agricultores empezaron a producir votos), se espera que la velocidad de sincronización se establezca en un número menor. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    Esto no es un error sino más bien una advertencia, es algo de esperar en una Red de Almacenamiento Descentralizada. No hay nada que tengas que hacer como usuario con este aviso, es probable que aparezca de vez en cuando pero mientras no haya otros errores más catastróficos se puede ignorar.

    Error al construir un farmer: existe el archivo

    0: Error al crear un farmer
    1: Error de creación de parcela de disco único: Error de E/S: El archivo existe (os error 17)
    2: Error de E/S: El fichero existe (os error 17)
    3: El archivo existe (os error 17)

    El sistema detecta una instalación preexistente. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Error de importación de bloque: Ataque potencial de largo alcance: bloque no en cadena finalizada.

    WARN sc_service::client::client: Error de importación del bloque: ataque de largo alcance Potential: bloque que no está en cadena finalizada.

    El nodo de alguna manera terminó siendo en un tenedor, trate de limpiar y empezar de cero.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index c2f8745601b..f833d1dfbb0 100644 --- a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index d1db5d3e8e7..5c6df69e32f 100644 --- a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Requisitos previos

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 8cf38bd4c0b..25eeab8c15f 100644 --- a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index f81f7eff3e0..88eb16b77f7 100644 --- a/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/es/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Solución de problemas

    Solución de problemas

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/index.html b/es/docs/pre-release/farming-&-staking/index.html index 943f585a077..1bddbc0df3f 100644 --- a/es/docs/pre-release/farming-&-staking/index.html +++ b/es/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/staking/index.html b/es/docs/pre-release/farming-&-staking/staking/index.html index 6fc978da7fa..15736189a08 100644 --- a/es/docs/pre-release/farming-&-staking/staking/index.html +++ b/es/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/staking/intro/index.html b/es/docs/pre-release/farming-&-staking/staking/intro/index.html index eb551248a69..57d1ee5f549 100644 --- a/es/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/es/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/staking/operators/index.html b/es/docs/pre-release/farming-&-staking/staking/operators/index.html index 184754ac0d7..44efd80726d 100644 --- a/es/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/es/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/timekeeping/index.html b/es/docs/pre-release/farming-&-staking/timekeeping/index.html index 8ff97073d9f..976ef1a31df 100644 --- a/es/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/es/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/es/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index bf28fc329cf..e40d404d599 100644 --- a/es/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/es/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    Esta es la cartera de barebones. Esto se debe a que es la cartera de Substrate de barebones que soporta todas las redes basadas en Substrate. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Crear un nuevo monedero

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. La extensión te mostrará tu semilla de mnemónica de 12 palabras.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Una vez que su semilla esté guardada y guardada de forma segura, haga clic en la casilla de verificación “He guardado mi semilla con seguridad” y haga clic en “Siguiente paso”

    2. The next step will ask for a Name & Password for the wallet. luego haga clic en "Añadir la cuenta con la semilla generada"

      step-6

    3. ¡Felicidades ha creado una cartera de polkadot.js!

      step-7

    Importar una semilla existente

    Algunos usuarios pueden ser provistos de una frase de semilla mnemónica existente que puede haber sido proporcionada por Subspace-Desktop, si este es el caso que querrá seguir esta parte de la guía.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Solución de problemas

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    ¿Cómo puedo encontrar mi dirección pública?

    • Puede ver su dirección pública por defecto de sustrato justo debajo de su nombre de cartera dentro de la extensión

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • Como se ve a continuación, a veces cuando instala o actualiza por primera vez la cartera Substrate necesitará actualizar los metadatos del monedero.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    ¿Cómo puedo hacer una copia de seguridad de mi cartera?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/es/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/es/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index 06377aea4cc..f3f284b3bd6 100644 --- a/es/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/es/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • URL de proveedor
    • Nombre de la red
    • Símbolo
    • Explorador de bloques
    • Crowdloan URL The only option that is required is the Provider URL. Puedes añadir un explorador si lo deseas, pero no es necesario. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Rellena la URL del proveedor, una vez que haga clic en esta casilla, marcará la URL y agregará el resto de la información, luego haga clic en Guardar.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Solución de problemas

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    ¿Cómo puedo hacer una copia de seguridad de mi cartera?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/es/docs/pre-release/learn/intro/index.html b/es/docs/pre-release/learn/intro/index.html index bcae128cb1d..a97678b221d 100644 --- a/es/docs/pre-release/learn/intro/index.html +++ b/es/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/es/docs/pre-release/learn/security/index.html b/es/docs/pre-release/learn/security/index.html index 0e4bd70f593..f3af6faf66e 100644 --- a/es/docs/pre-release/learn/security/index.html +++ b/es/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/learn/subnomicon/index.html b/es/docs/pre-release/learn/subnomicon/index.html index c22288f1cef..322553a8796 100644 --- a/es/docs/pre-release/learn/subnomicon/index.html +++ b/es/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/es/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/es/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 17c3dc011f7..a2ac9f951d7 100644 --- a/es/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/es/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -41,7 +41,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/participate/contribute/index.html b/es/docs/pre-release/participate/contribute/index.html index 160f0df85f2..ce0c07e14b0 100644 --- a/es/docs/pre-release/participate/contribute/index.html +++ b/es/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Echa un vistazo a algunas de estas guías increíbles para ayudarte a familiarizarte con GitHub y contribuir.

    Arreglo avanzado

    Esta sección presupone una mejor comprensión de GitHub, y de los conceptos básicos de programación.

    Para arreglos más grandes y más avanzados, por favor asegúrese de seguir los principios básicos a continuación.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Haga comentarios sobre el código no trivial complejo, la lógica compleja debería ser fácil de entender.
    • Todas las funciones públicas deben ser comentadas.
    • Si el código es trivial pero puede ser olvidado con el tiempo, por favor comente.
    • Intenta pensar en tu código desde una vista de tercera persona. debería tener sentido para cualquier persona con un fondo similar en la tecnología que está utilizando.
    • A veces es difícil de entender el código necesita refactorizar en lugar de más comentarios.
    • Asegúrese de que el programa todavía puede construir antes de pull request.

    Para las correcciones avanzadas debes seguir la vía general de GitHub.

    1. Create your own fork of the code. Fork
    2. Haga los cambios localmente en su sistema en su entorno de desarrollo preferido.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    Cómo reportar un error o error

    No tenemos ninguna plantilla estricta que usted debe seguir, pero por favor proporcione toda la información requerida para que podamos resolver rápidamente cualquier problema.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    Cómo sugerir una característica o mejora

    Esta documentación es para la comunidad, por lo que cualquier petición de característica es bienvenida.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explique por qué es necesario este problema y qué problemas resolverá.
    • Indique si está capacitado o dispuesto a ayudar a implementar esta función.

    Proceso de revisión de código

    • El equipo central echará un vistazo a cualquier pull request tan pronto como sea posible, generalmente puede esperar una respuesta dentro de uno o dos días.
    • Si se trata de una solución simple y no polémica, revisaremos el código y aprobaremos.
    • Si hay preguntas, comentarios, o más discusión debe ser si nos comunicamos con el colaborador de la Pull Request para intentar resolver dichos problemas.
    • Si no hay respuesta o actividad dentro de las dos semanas siguientes a la respuesta del equipo, podemos cerrar la solicitud de extracción.

    Comunidad

    Puedes chatear con el equipo central en Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/es/docs/pre-release/participate/index.html b/es/docs/pre-release/participate/index.html index 377bf665afa..18ae6df18b6 100644 --- a/es/docs/pre-release/participate/index.html +++ b/es/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Increíble Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articulos

    Información

    Preguntas Más Frecuentes

    Comenzando la agricultura

    Medium

    Guía de inicio

    Traer el consenso de PoC a Substrate

    Subspace es el primer protocolo para resolver completamente el trilema del blockchain sin compromiso. proporcionado por solgas

    Eventos

    1er AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/es/docs/pre-release/participate/translate/index.html b/es/docs/pre-release/participate/translate/index.html index 49252f1a6bd..dba9f722c7e 100644 --- a/es/docs/pre-release/participate/translate/index.html +++ b/es/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Guía de traducción

    Guía de traducción

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Requisitos previos

    Lineamientos

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    Cómo hacer

    A continuación encontrará el itinerario sobre cómo proporcionar traducciones para la red de subspace a través del portal de traducción de Crowdin.

    1. Visita el respectivo portal de traducción para el que quieres ayudar a traducir (Ver arriba)

      translate-step-1

    2. Una vez que haya iniciado sesión y se haya unido al proyecto, se le llevará al panel de control del proyecto, seleccione el idioma que desea traducir. Ver a continuación

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. Luego se te introducirá en el Portal de Traducción, en este portal encontrarás lo siguiente

      1. Versión en inglés del texto
      2. Marcar para introducir la traducción del idioma del texto en blanco
      3. Sugerencias automatizadas para el texto
      4. Lista de palabras que necesita traducir
      5. Un lugar para comentarios si algo necesita aclaración

      translate-step-4

    5. Desde aquí completarás tus traducciones como quieras y finalizarás una vez hayas terminado.

    6. Su traducción será revisada y aprobada en el momento oportuno. tenga en cuenta que las traducciones pueden tardar un par de días antes de que se llenen en la documentación desplegada.

    - + \ No newline at end of file diff --git a/es/index.html b/es/index.html index d20d0299e23..4db8ee059cc 100644 --- a/es/index.html +++ b/es/index.html @@ -7,13 +7,13 @@ - +

    Granja desde cualquier lugar

    Gana recompensas ejecutando un nodo de agricultor comprometiendo un disco de repuesto. No se requiere una configuración costosa ni capital por adelantado.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/es/markdown-page/index.html b/es/markdown-page/index.html index 13009c8a99e..2629ef68aa1 100644 --- a/es/markdown-page/index.html +++ b/es/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/404.html b/fr/404.html index 25bb58f4534..3bc7f59cf4a 100644 --- a/fr/404.html +++ b/fr/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/assets/js/42e0dbad.d8433c22.js b/fr/assets/js/42e0dbad.d8433c22.js new file mode 100644 index 00000000000..24028844f24 --- /dev/null +++ b/fr/assets/js/42e0dbad.d8433c22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[7748],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8733:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/fr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/fr/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/fr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/fr/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/fr/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/fr/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/fr/assets/js/42e0dbad.fbdc990a.js b/fr/assets/js/42e0dbad.fbdc990a.js deleted file mode 100644 index 12f0f8b7c73..00000000000 --- a/fr/assets/js/42e0dbad.fbdc990a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[7748],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8733:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/fr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/fr/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/fr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/fr/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/fr/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/fr/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/fr/assets/js/931df8fb.4cba93bf.js b/fr/assets/js/931df8fb.4cba93bf.js deleted file mode 100644 index 913e8e6fd6e..00000000000 --- a/fr/assets/js/931df8fb.4cba93bf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4069],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},9288:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/fr/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/fr/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/fr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/fr/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/fr/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/fr/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/fr/assets/js/931df8fb.50604c54.js b/fr/assets/js/931df8fb.50604c54.js new file mode 100644 index 00000000000..e9845bfc4d1 --- /dev/null +++ b/fr/assets/js/931df8fb.50604c54.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4069],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},9288:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/fr/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/fr/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/fr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/fr/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/fr/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/fr/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/fr/assets/js/runtime~main.42746fb0.js b/fr/assets/js/runtime~main.93ceacae.js similarity index 98% rename from fr/assets/js/runtime~main.42746fb0.js rename to fr/assets/js/runtime~main.93ceacae.js index 4469e02d407..1a959bfda4e 100644 --- a/fr/assets/js/runtime~main.42746fb0.js +++ b/fr/assets/js/runtime~main.93ceacae.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,b,d,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return c[e].call(f.exports,f,f.exports,r),f.exports}r.m=c,e=[],r.O=(a,f,b,d)=>{if(!f){var c=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,b,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&b&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(d,c),d},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",70:"c6a46c58",100:"947ead56",242:"6b3c4f69",334:"dca2d7a9",501:"40653914",615:"aebcd370",625:"b1311d12",706:"fc93b4d7",740:"e1ee5ca0",821:"54f978f1",831:"8d038f6a",903:"88a6557b",963:"3ca0a71c",1020:"6889d67d",1071:"c21ae42a",1185:"ebf4992e",1625:"3088ba6d",1934:"f2631607",1953:"30b4671d",1962:"85df6e07",2095:"f2214254",2121:"02ddcccd",2188:"1b25ebe1",2286:"436752e0",2382:"f99cc666",2627:"2d10d84b",2659:"438b34fe",2747:"d0b9dd48",2755:"aed24a68",2944:"a94b3423",2984:"d1be85ce",3085:"1f391b9e",3185:"fb6c95b5",3205:"43ed7134",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3606:"5fedb718",3788:"9c0ec34c",3886:"b9f7631c",3894:"9d0e7805",3995:"c464bac4",4018:"c1bb268b",4069:"931df8fb",4151:"84828519",4307:"99086cb8",4368:"f63740a4",4384:"71e18e71",4467:"a00be319",4528:"115e41f0",4567:"8219832a",4640:"481e7a9b",4676:"e8bc26f4",4826:"c8c2eb8a",5012:"4a7a54a1",5136:"a4c164b9",5137:"6c0436a1",5260:"23333a76",5485:"c396bdbc",5580:"f7e3af2e",5824:"e1155588",5850:"fdd8e3d9",5853:"a8a34c06",6541:"9225e1b0",6827:"2231adaf",7203:"0ab36be5",7216:"6967a9d9",7370:"c09f4ff7",7389:"d1731158",7414:"393be207",7487:"3cd393ab",7495:"8fb81b00",7531:"ed02b928",7748:"42e0dbad",7765:"fe1ae1d6",7792:"079da8b8",7897:"9e5e0fa0",7918:"17896441",7941:"da0b41f3",7997:"55621a3d",8086:"85aa9c35",8269:"758680a2",8278:"36d9f525",8291:"42254623",8293:"cb112f40",8406:"2b1c9a99",8614:"0f338137",8719:"f08392a5",8808:"d35d34b2",8822:"486f1b86",8851:"cde24d23",9514:"1be78505",9697:"ba7dbe67",9813:"6af24fee",9817:"14eb3368",9941:"bf773bdd",9956:"ff6675b4"}[e]||e)+"."+{53:"19f35d43",70:"43998953",100:"b7346dc1",242:"96cf2f97",334:"c7b03a71",501:"43312aa7",615:"e4ccd78b",625:"f8d23e2d",706:"624ae6a5",740:"8e402181",814:"dc8c3a26",821:"3b068324",831:"7f255068",903:"f0707b7c",963:"952c1a6c",1020:"b793fcf9",1071:"0f60eb5e",1185:"275a556a",1625:"1e86e34b",1934:"396ccff1",1953:"43ebdc8c",1962:"36e733bc",2095:"3a37b67b",2121:"37dd84b3",2188:"d1a8e4aa",2286:"ab6d7b46",2382:"7fe35716",2627:"3b253f8c",2659:"d8782760",2747:"6d73fb11",2755:"0cd12e9b",2944:"6033c87c",2984:"0cd59243",3085:"3a447380",3185:"ef08fc63",3203:"c0b8bfe8",3205:"700d87ec",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3473:"fdffa07c",3606:"e8604024",3788:"cf22a1b4",3886:"768ca15e",3894:"5c0a6928",3995:"a3990fd8",4018:"7a0fae4e",4069:"4cba93bf",4151:"f7f756f4",4307:"00d8a9a2",4368:"bff234cd",4384:"203669d5",4467:"02efea89",4528:"535d1078",4567:"24f25e10",4640:"19a8b218",4676:"522e4086",4826:"427cb496",4972:"4a54fd4a",5012:"f67e2713",5136:"61ca1bc0",5137:"419109a6",5260:"42670f30",5485:"3e760f57",5580:"19830aad",5824:"342dbc47",5850:"9df4f90e",5853:"c3ca2cc2",6541:"a818b889",6827:"21350c0b",7203:"12f50c81",7216:"80815502",7370:"9659a185",7389:"19e8b036",7414:"30e48ec5",7487:"4a9c978c",7495:"04f1aa1c",7531:"b985c3b1",7748:"fbdc990a",7765:"2f86cc70",7792:"a91efe11",7897:"8f4554cf",7918:"e3da5265",7941:"4f1ceba7",7997:"3103281e",8086:"0cb2e093",8269:"fea6c220",8278:"43f7f720",8291:"95ab90f8",8293:"90b1de17",8406:"ab6e62a2",8614:"4d397388",8719:"bd67bdcd",8808:"15c85aaf",8822:"45803718",8851:"36e88732",9514:"478c02c6",9697:"99f6de9b",9813:"2ac2cdef",9817:"b7ea7ab7",9941:"14effc8d",9956:"a5826c7f"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},d="portal:",r.l=(e,a,f,c)=>{if(b[e])b[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/fr/",r.gca=function(e){return e={17896441:"7918",40653914:"501",42254623:"8291",84828519:"4151","935f2afb":"53",c6a46c58:"70","947ead56":"100","6b3c4f69":"242",dca2d7a9:"334",aebcd370:"615",b1311d12:"625",fc93b4d7:"706",e1ee5ca0:"740","54f978f1":"821","8d038f6a":"831","88a6557b":"903","3ca0a71c":"963","6889d67d":"1020",c21ae42a:"1071",ebf4992e:"1185","3088ba6d":"1625",f2631607:"1934","30b4671d":"1953","85df6e07":"1962",f2214254:"2095","02ddcccd":"2121","1b25ebe1":"2188","436752e0":"2286",f99cc666:"2382","2d10d84b":"2627","438b34fe":"2659",d0b9dd48:"2747",aed24a68:"2755",a94b3423:"2944",d1be85ce:"2984","1f391b9e":"3085",fb6c95b5:"3185","43ed7134":"3205",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","5fedb718":"3606","9c0ec34c":"3788",b9f7631c:"3886","9d0e7805":"3894",c464bac4:"3995",c1bb268b:"4018","931df8fb":"4069","99086cb8":"4307",f63740a4:"4368","71e18e71":"4384",a00be319:"4467","115e41f0":"4528","8219832a":"4567","481e7a9b":"4640",e8bc26f4:"4676",c8c2eb8a:"4826","4a7a54a1":"5012",a4c164b9:"5136","6c0436a1":"5137","23333a76":"5260",c396bdbc:"5485",f7e3af2e:"5580",e1155588:"5824",fdd8e3d9:"5850",a8a34c06:"5853","9225e1b0":"6541","2231adaf":"6827","0ab36be5":"7203","6967a9d9":"7216",c09f4ff7:"7370",d1731158:"7389","393be207":"7414","3cd393ab":"7487","8fb81b00":"7495",ed02b928:"7531","42e0dbad":"7748",fe1ae1d6:"7765","079da8b8":"7792","9e5e0fa0":"7897",da0b41f3:"7941","55621a3d":"7997","85aa9c35":"8086","758680a2":"8269","36d9f525":"8278",cb112f40:"8293","2b1c9a99":"8406","0f338137":"8614",f08392a5:"8719",d35d34b2:"8808","486f1b86":"8822",cde24d23:"8851","1be78505":"9514",ba7dbe67:"9697","6af24fee":"9813","14eb3368":"9817",bf773bdd:"9941",ff6675b4:"9956"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var b=r.o(e,a)?e[a]:void 0;if(0!==b)if(b)f.push(b[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>b=e[a]=[f,d]));f.push(b[2]=d);var c=r.p+r.u(a),t=new Error;r.l(c,(f=>{if(r.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var d=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+c+")",t.name="ChunkLoadError",t.type=d,t.request=c,b[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var b,d,c=f[0],t=f[1],o=f[2],n=0;if(c.some((a=>0!==e[a]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,b,d,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return c[e].call(f.exports,f,f.exports,r),f.exports}r.m=c,e=[],r.O=(a,f,b,d)=>{if(!f){var c=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,b,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&b&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(d,c),d},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",70:"c6a46c58",100:"947ead56",242:"6b3c4f69",334:"dca2d7a9",501:"40653914",615:"aebcd370",625:"b1311d12",706:"fc93b4d7",740:"e1ee5ca0",821:"54f978f1",831:"8d038f6a",903:"88a6557b",963:"3ca0a71c",1020:"6889d67d",1071:"c21ae42a",1185:"ebf4992e",1625:"3088ba6d",1934:"f2631607",1953:"30b4671d",1962:"85df6e07",2095:"f2214254",2121:"02ddcccd",2188:"1b25ebe1",2286:"436752e0",2382:"f99cc666",2627:"2d10d84b",2659:"438b34fe",2747:"d0b9dd48",2755:"aed24a68",2944:"a94b3423",2984:"d1be85ce",3085:"1f391b9e",3185:"fb6c95b5",3205:"43ed7134",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3606:"5fedb718",3788:"9c0ec34c",3886:"b9f7631c",3894:"9d0e7805",3995:"c464bac4",4018:"c1bb268b",4069:"931df8fb",4151:"84828519",4307:"99086cb8",4368:"f63740a4",4384:"71e18e71",4467:"a00be319",4528:"115e41f0",4567:"8219832a",4640:"481e7a9b",4676:"e8bc26f4",4826:"c8c2eb8a",5012:"4a7a54a1",5136:"a4c164b9",5137:"6c0436a1",5260:"23333a76",5485:"c396bdbc",5580:"f7e3af2e",5824:"e1155588",5850:"fdd8e3d9",5853:"a8a34c06",6541:"9225e1b0",6827:"2231adaf",7203:"0ab36be5",7216:"6967a9d9",7370:"c09f4ff7",7389:"d1731158",7414:"393be207",7487:"3cd393ab",7495:"8fb81b00",7531:"ed02b928",7748:"42e0dbad",7765:"fe1ae1d6",7792:"079da8b8",7897:"9e5e0fa0",7918:"17896441",7941:"da0b41f3",7997:"55621a3d",8086:"85aa9c35",8269:"758680a2",8278:"36d9f525",8291:"42254623",8293:"cb112f40",8406:"2b1c9a99",8614:"0f338137",8719:"f08392a5",8808:"d35d34b2",8822:"486f1b86",8851:"cde24d23",9514:"1be78505",9697:"ba7dbe67",9813:"6af24fee",9817:"14eb3368",9941:"bf773bdd",9956:"ff6675b4"}[e]||e)+"."+{53:"19f35d43",70:"43998953",100:"b7346dc1",242:"96cf2f97",334:"c7b03a71",501:"43312aa7",615:"e4ccd78b",625:"f8d23e2d",706:"624ae6a5",740:"8e402181",814:"dc8c3a26",821:"3b068324",831:"7f255068",903:"f0707b7c",963:"952c1a6c",1020:"b793fcf9",1071:"0f60eb5e",1185:"275a556a",1625:"1e86e34b",1934:"396ccff1",1953:"43ebdc8c",1962:"36e733bc",2095:"3a37b67b",2121:"37dd84b3",2188:"d1a8e4aa",2286:"ab6d7b46",2382:"7fe35716",2627:"3b253f8c",2659:"d8782760",2747:"6d73fb11",2755:"0cd12e9b",2944:"6033c87c",2984:"0cd59243",3085:"3a447380",3185:"ef08fc63",3203:"c0b8bfe8",3205:"700d87ec",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3473:"fdffa07c",3606:"e8604024",3788:"cf22a1b4",3886:"768ca15e",3894:"5c0a6928",3995:"a3990fd8",4018:"7a0fae4e",4069:"50604c54",4151:"f7f756f4",4307:"00d8a9a2",4368:"bff234cd",4384:"203669d5",4467:"02efea89",4528:"535d1078",4567:"24f25e10",4640:"19a8b218",4676:"522e4086",4826:"427cb496",4972:"4a54fd4a",5012:"f67e2713",5136:"61ca1bc0",5137:"419109a6",5260:"42670f30",5485:"3e760f57",5580:"19830aad",5824:"342dbc47",5850:"9df4f90e",5853:"c3ca2cc2",6541:"a818b889",6827:"21350c0b",7203:"12f50c81",7216:"80815502",7370:"9659a185",7389:"19e8b036",7414:"30e48ec5",7487:"4a9c978c",7495:"04f1aa1c",7531:"b985c3b1",7748:"d8433c22",7765:"2f86cc70",7792:"a91efe11",7897:"8f4554cf",7918:"e3da5265",7941:"4f1ceba7",7997:"3103281e",8086:"0cb2e093",8269:"fea6c220",8278:"43f7f720",8291:"95ab90f8",8293:"90b1de17",8406:"ab6e62a2",8614:"4d397388",8719:"bd67bdcd",8808:"15c85aaf",8822:"45803718",8851:"36e88732",9514:"478c02c6",9697:"99f6de9b",9813:"2ac2cdef",9817:"b7ea7ab7",9941:"14effc8d",9956:"a5826c7f"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),b={},d="portal:",r.l=(e,a,f,c)=>{if(b[e])b[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/fr/",r.gca=function(e){return e={17896441:"7918",40653914:"501",42254623:"8291",84828519:"4151","935f2afb":"53",c6a46c58:"70","947ead56":"100","6b3c4f69":"242",dca2d7a9:"334",aebcd370:"615",b1311d12:"625",fc93b4d7:"706",e1ee5ca0:"740","54f978f1":"821","8d038f6a":"831","88a6557b":"903","3ca0a71c":"963","6889d67d":"1020",c21ae42a:"1071",ebf4992e:"1185","3088ba6d":"1625",f2631607:"1934","30b4671d":"1953","85df6e07":"1962",f2214254:"2095","02ddcccd":"2121","1b25ebe1":"2188","436752e0":"2286",f99cc666:"2382","2d10d84b":"2627","438b34fe":"2659",d0b9dd48:"2747",aed24a68:"2755",a94b3423:"2944",d1be85ce:"2984","1f391b9e":"3085",fb6c95b5:"3185","43ed7134":"3205",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","5fedb718":"3606","9c0ec34c":"3788",b9f7631c:"3886","9d0e7805":"3894",c464bac4:"3995",c1bb268b:"4018","931df8fb":"4069","99086cb8":"4307",f63740a4:"4368","71e18e71":"4384",a00be319:"4467","115e41f0":"4528","8219832a":"4567","481e7a9b":"4640",e8bc26f4:"4676",c8c2eb8a:"4826","4a7a54a1":"5012",a4c164b9:"5136","6c0436a1":"5137","23333a76":"5260",c396bdbc:"5485",f7e3af2e:"5580",e1155588:"5824",fdd8e3d9:"5850",a8a34c06:"5853","9225e1b0":"6541","2231adaf":"6827","0ab36be5":"7203","6967a9d9":"7216",c09f4ff7:"7370",d1731158:"7389","393be207":"7414","3cd393ab":"7487","8fb81b00":"7495",ed02b928:"7531","42e0dbad":"7748",fe1ae1d6:"7765","079da8b8":"7792","9e5e0fa0":"7897",da0b41f3:"7941","55621a3d":"7997","85aa9c35":"8086","758680a2":"8269","36d9f525":"8278",cb112f40:"8293","2b1c9a99":"8406","0f338137":"8614",f08392a5:"8719",d35d34b2:"8808","486f1b86":"8822",cde24d23:"8851","1be78505":"9514",ba7dbe67:"9697","6af24fee":"9813","14eb3368":"9817",bf773bdd:"9941",ff6675b4:"9956"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var b=r.o(e,a)?e[a]:void 0;if(0!==b)if(b)f.push(b[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>b=e[a]=[f,d]));f.push(b[2]=d);var c=r.p+r.u(a),t=new Error;r.l(c,(f=>{if(r.o(e,a)&&(0!==(b=e[a])&&(e[a]=void 0),b)){var d=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+c+")",t.name="ChunkLoadError",t.type=d,t.request=c,b[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var b,d,c=f[0],t=f[1],o=f[2],n=0;if(c.some((a=>0!==e[a]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/fr/docs/category/advanced-cli/index.html b/fr/docs/category/advanced-cli/index.html index 0b70b37b4f5..e69c93a6a0a 100644 --- a/fr/docs/category/advanced-cli/index.html +++ b/fr/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/category/develop-on-nova-evm-/index.html b/fr/docs/category/develop-on-nova-evm-/index.html index bb81ac68a6a..ad1bd8c0000 100644 --- a/fr/docs/category/develop-on-nova-evm-/index.html +++ b/fr/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/fr/docs/category/develop/index.html b/fr/docs/category/develop/index.html index 82f4ee24388..78617a0da45 100644 --- a/fr/docs/category/develop/index.html +++ b/fr/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/category/farming/index.html b/fr/docs/category/farming/index.html index 79be082503d..a4e7efb2d24 100644 --- a/fr/docs/category/farming/index.html +++ b/fr/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/category/learn/index.html b/fr/docs/category/learn/index.html index ce0e0ace9a1..cb5af75f3e3 100644 --- a/fr/docs/category/learn/index.html +++ b/fr/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/category/operators-and-nominators/index.html b/fr/docs/category/operators-and-nominators/index.html index ec689d5b94c..eae23962a41 100644 --- a/fr/docs/category/operators-and-nominators/index.html +++ b/fr/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/category/participate/index.html b/fr/docs/category/participate/index.html index 11ad71237d7..3744d6ee442 100644 --- a/fr/docs/category/participate/index.html +++ b/fr/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/category/pulsar-recommended/index.html b/fr/docs/category/pulsar-recommended/index.html index f2375b6080c..9a1ef0526fb 100644 --- a/fr/docs/category/pulsar-recommended/index.html +++ b/fr/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/category/wallets/index.html b/fr/docs/category/wallets/index.html index f5ea3fe8cbe..a9a55cf7b7d 100644 --- a/fr/docs/category/wallets/index.html +++ b/fr/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/develop/nova/block_explorer/index.html b/fr/docs/develop/nova/block_explorer/index.html index f9322777374..66978ee5c9d 100644 --- a/fr/docs/develop/nova/block_explorer/index.html +++ b/fr/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/develop/nova/faucet/index.html b/fr/docs/develop/nova/faucet/index.html index b8b65c4d4c2..80184311da9 100644 --- a/fr/docs/develop/nova/faucet/index.html +++ b/fr/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/fr/docs/develop/nova/foundry_guide/index.html b/fr/docs/develop/nova/foundry_guide/index.html index 082c8c57617..59fcbb76847 100644 --- a/fr/docs/develop/nova/foundry_guide/index.html +++ b/fr/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/fr/docs/develop/nova/general-information/index.html b/fr/docs/develop/nova/general-information/index.html index 32abeb68fcf..4300453d820 100644 --- a/fr/docs/develop/nova/general-information/index.html +++ b/fr/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/fr/docs/develop/nova/hardhat_guide/index.html b/fr/docs/develop/nova/hardhat_guide/index.html index 409fd2a66b6..7367c60dc65 100644 --- a/fr/docs/develop/nova/hardhat_guide/index.html +++ b/fr/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/fr/docs/develop/nova/intro/index.html b/fr/docs/develop/nova/intro/index.html index 4dd73e2c4eb..911e4bebafd 100644 --- a/fr/docs/develop/nova/intro/index.html +++ b/fr/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/fr/docs/develop/nova/local_development/index.html b/fr/docs/develop/nova/local_development/index.html index 1ab1cd16af4..c963986cb94 100644 --- a/fr/docs/develop/nova/local_development/index.html +++ b/fr/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/fr/docs/develop/nova/quick_start/index.html b/fr/docs/develop/nova/quick_start/index.html index f43edd95fd3..41bbf174d4d 100644 --- a/fr/docs/develop/nova/quick_start/index.html +++ b/fr/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/fr/docs/develop/nova/remix_guide/index.html b/fr/docs/develop/nova/remix_guide/index.html index 140a832f195..24dc8c6ecc8 100644 --- a/fr/docs/develop/nova/remix_guide/index.html +++ b/fr/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/fr/docs/develop/nova/setting-up-metamask/index.html b/fr/docs/develop/nova/setting-up-metamask/index.html index 44f7a41b27e..24c721f8dc0 100644 --- a/fr/docs/develop/nova/setting-up-metamask/index.html +++ b/fr/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/fr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index d8a0d4e94bc..b959c183835 100644 --- a/fr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/fr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/fr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index a53920c0a59..bba34a84ca7 100644 --- a/fr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/fr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/fr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 46d567c1372..4ec15e1a0ea 100644 --- a/fr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/fr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/fr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 82444a5d4c6..ad7bd9d5cb5 100644 --- a/fr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/fr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/fr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 69379c9c068..ec4a061fe26 100644 --- a/fr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/fr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/common_problems/index.html b/fr/docs/farming-&-staking/farming/common_problems/index.html index b426a00849a..4a78602c524 100644 --- a/fr/docs/farming-&-staking/farming/common_problems/index.html +++ b/fr/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/fr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 1af09716c46..4ee780137e9 100644 --- a/fr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/fr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/fr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index ca436d19dd9..bbb881767d4 100644 --- a/fr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/fr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/fr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index b758d000b08..4c898eb3b33 100644 --- a/fr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/fr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/fr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 8ea80bb69af..24fe7149ca2 100644 --- a/fr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/fr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/index.html b/fr/docs/farming-&-staking/index.html index 5ec469dbe26..cfcb16f14c3 100644 --- a/fr/docs/farming-&-staking/index.html +++ b/fr/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/staking/index.html b/fr/docs/farming-&-staking/staking/index.html index b67b0568b37..bcee30449c4 100644 --- a/fr/docs/farming-&-staking/staking/index.html +++ b/fr/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/staking/intro/index.html b/fr/docs/farming-&-staking/staking/intro/index.html index 62085c88e50..cd7de1375ea 100644 --- a/fr/docs/farming-&-staking/staking/intro/index.html +++ b/fr/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/staking/operators/index.html b/fr/docs/farming-&-staking/staking/operators/index.html index 7ffc1ea7e24..c4cfb8cbc4d 100644 --- a/fr/docs/farming-&-staking/staking/operators/index.html +++ b/fr/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/timekeeping/index.html b/fr/docs/farming-&-staking/timekeeping/index.html index 7f7f0b91108..6b523512197 100644 --- a/fr/docs/farming-&-staking/timekeeping/index.html +++ b/fr/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/wallets/polkadot/index.html b/fr/docs/farming-&-staking/wallets/polkadot/index.html index 0539c7d25bc..769f938312e 100644 --- a/fr/docs/farming-&-staking/wallets/polkadot/index.html +++ b/fr/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/fr/docs/farming-&-staking/wallets/subwallet/index.html b/fr/docs/farming-&-staking/wallets/subwallet/index.html index c55c111429c..18e26019d51 100644 --- a/fr/docs/farming-&-staking/wallets/subwallet/index.html +++ b/fr/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/fr/docs/learn/intro/index.html b/fr/docs/learn/intro/index.html index a98445ea12c..36c675c6006 100644 --- a/fr/docs/learn/intro/index.html +++ b/fr/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/fr/docs/learn/security/index.html b/fr/docs/learn/security/index.html index aacfb6d6a0c..6a49011dcfb 100644 --- a/fr/docs/learn/security/index.html +++ b/fr/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/fr/docs/learn/subnomicon/index.html b/fr/docs/learn/subnomicon/index.html index b532dd1afb5..8648c352722 100644 --- a/fr/docs/learn/subnomicon/index.html +++ b/fr/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/fr/docs/participate/CODE_OF_CONDUCT/index.html b/fr/docs/participate/CODE_OF_CONDUCT/index.html index e70f76f67f9..62b3c4c3d9f 100644 --- a/fr/docs/participate/CODE_OF_CONDUCT/index.html +++ b/fr/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/fr/docs/participate/contribute/index.html b/fr/docs/participate/contribute/index.html index ef05670a942..3548f34c073 100644 --- a/fr/docs/participate/contribute/index.html +++ b/fr/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/fr/docs/participate/index.html b/fr/docs/participate/index.html index 134a94da339..196e4b48f0f 100644 --- a/fr/docs/participate/index.html +++ b/fr/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/fr/docs/participate/translate/index.html b/fr/docs/participate/translate/index.html index 0ba59760f01..08385671717 100644 --- a/fr/docs/participate/translate/index.html +++ b/fr/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/additional-guides/index.html b/fr/docs/pre-release/category/additional-guides/index.html index c177497e6fb..90cc5f2df1a 100644 --- a/fr/docs/pre-release/category/additional-guides/index.html +++ b/fr/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/advanced-cli/index.html b/fr/docs/pre-release/category/advanced-cli/index.html index 9da304f670f..0c2a98d7642 100644 --- a/fr/docs/pre-release/category/advanced-cli/index.html +++ b/fr/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/develop-on-nova-evm-/index.html b/fr/docs/pre-release/category/develop-on-nova-evm-/index.html index d09d0472ac8..b186717b3f1 100644 --- a/fr/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/fr/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/develop/index.html b/fr/docs/pre-release/category/develop/index.html index 682018c4425..9e3251f257b 100644 --- a/fr/docs/pre-release/category/develop/index.html +++ b/fr/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/farming/index.html b/fr/docs/pre-release/category/farming/index.html index aa75e8409e2..400c06e71b8 100644 --- a/fr/docs/pre-release/category/farming/index.html +++ b/fr/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/learn/index.html b/fr/docs/pre-release/category/learn/index.html index 7991b2a827c..c2a65d12352 100644 --- a/fr/docs/pre-release/category/learn/index.html +++ b/fr/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/operators-and-nominators/index.html b/fr/docs/pre-release/category/operators-and-nominators/index.html index bed89b40854..3b10f78fcec 100644 --- a/fr/docs/pre-release/category/operators-and-nominators/index.html +++ b/fr/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/participate/index.html b/fr/docs/pre-release/category/participate/index.html index ff32c11b975..29d7845f668 100644 --- a/fr/docs/pre-release/category/participate/index.html +++ b/fr/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/pulsar-recommended/index.html b/fr/docs/pre-release/category/pulsar-recommended/index.html index 094a8650861..094814e1830 100644 --- a/fr/docs/pre-release/category/pulsar-recommended/index.html +++ b/fr/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/category/wallets/index.html b/fr/docs/pre-release/category/wallets/index.html index 54c72a23525..b84f9a4e54a 100644 --- a/fr/docs/pre-release/category/wallets/index.html +++ b/fr/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/block_explorer/index.html b/fr/docs/pre-release/develop/nova/block_explorer/index.html index 6575f83a83c..131b0f48ec3 100644 --- a/fr/docs/pre-release/develop/nova/block_explorer/index.html +++ b/fr/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/faucet/index.html b/fr/docs/pre-release/develop/nova/faucet/index.html index fcb2f530dbb..e36dc330040 100644 --- a/fr/docs/pre-release/develop/nova/faucet/index.html +++ b/fr/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/foundry_guide/index.html b/fr/docs/pre-release/develop/nova/foundry_guide/index.html index f72ffbed8a2..19040df7c64 100644 --- a/fr/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/fr/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/general-information/index.html b/fr/docs/pre-release/develop/nova/general-information/index.html index d564bf63f6c..74609aa4d7b 100644 --- a/fr/docs/pre-release/develop/nova/general-information/index.html +++ b/fr/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/hardhat_guide/index.html b/fr/docs/pre-release/develop/nova/hardhat_guide/index.html index ba96c25ff8c..59bd62fd174 100644 --- a/fr/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/fr/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/intro/index.html b/fr/docs/pre-release/develop/nova/intro/index.html index 532e3924a37..8c43ea89066 100644 --- a/fr/docs/pre-release/develop/nova/intro/index.html +++ b/fr/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/local_development/index.html b/fr/docs/pre-release/develop/nova/local_development/index.html index 93fdf441177..7746ab63c79 100644 --- a/fr/docs/pre-release/develop/nova/local_development/index.html +++ b/fr/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/quick_start/index.html b/fr/docs/pre-release/develop/nova/quick_start/index.html index edbb76cfb86..390fe829587 100644 --- a/fr/docs/pre-release/develop/nova/quick_start/index.html +++ b/fr/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/remix_guide/index.html b/fr/docs/pre-release/develop/nova/remix_guide/index.html index d04a916248c..52bcfe552fe 100644 --- a/fr/docs/pre-release/develop/nova/remix_guide/index.html +++ b/fr/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/develop/nova/setting-up-metamask/index.html b/fr/docs/pre-release/develop/nova/setting-up-metamask/index.html index f84cdce4b89..e02131a68fa 100644 --- a/fr/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/fr/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/fr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 31b86aa063e..dcec9e89812 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 751c0f6abb2..8b474a7c01a 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index ccfdcc933e0..c9340cc9a63 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 3b7932e095a..d95319093e1 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index c4984120992..8821710f183 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/fr/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 19e580b70ba..1582fac6a15 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 14017889cde..903b126fd4f 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 0f39cf81817..95bfd1d65c7 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index a2f0ea59509..b804f6a5554 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 5c0cad2452c..4ccbc97eec5 100644 --- a/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/fr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/index.html b/fr/docs/pre-release/farming-&-staking/index.html index d1afa197a0f..d43909c5064 100644 --- a/fr/docs/pre-release/farming-&-staking/index.html +++ b/fr/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/staking/index.html b/fr/docs/pre-release/farming-&-staking/staking/index.html index 1faaf0e6397..93445e02df5 100644 --- a/fr/docs/pre-release/farming-&-staking/staking/index.html +++ b/fr/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/staking/intro/index.html b/fr/docs/pre-release/farming-&-staking/staking/intro/index.html index 7ff2167e88f..7b949b2156c 100644 --- a/fr/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/fr/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/staking/operators/index.html b/fr/docs/pre-release/farming-&-staking/staking/operators/index.html index 5ae86ba1dc2..a7e4a104958 100644 --- a/fr/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/fr/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/timekeeping/index.html b/fr/docs/pre-release/farming-&-staking/timekeeping/index.html index 06a46420d16..611ed6a577e 100644 --- a/fr/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/fr/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/fr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 6f3ccdbfdb4..6022fa59f73 100644 --- a/fr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/fr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/fr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index bc717ead114..5c6bc553f9f 100644 --- a/fr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/fr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/learn/intro/index.html b/fr/docs/pre-release/learn/intro/index.html index 45b0c47a2ab..51a10a68637 100644 --- a/fr/docs/pre-release/learn/intro/index.html +++ b/fr/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/learn/security/index.html b/fr/docs/pre-release/learn/security/index.html index 01d0ed8fe87..2bb9e98b89e 100644 --- a/fr/docs/pre-release/learn/security/index.html +++ b/fr/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/learn/subnomicon/index.html b/fr/docs/pre-release/learn/subnomicon/index.html index 8e1d4b00539..8a9342250ef 100644 --- a/fr/docs/pre-release/learn/subnomicon/index.html +++ b/fr/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/fr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 4450dc7b6f6..ccf99dc47d1 100644 --- a/fr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/fr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/participate/contribute/index.html b/fr/docs/pre-release/participate/contribute/index.html index f8a422bf48a..55953e35269 100644 --- a/fr/docs/pre-release/participate/contribute/index.html +++ b/fr/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/fr/docs/pre-release/participate/index.html b/fr/docs/pre-release/participate/index.html index 8a74d45ac2c..fc7e7045cc1 100644 --- a/fr/docs/pre-release/participate/index.html +++ b/fr/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/fr/docs/pre-release/participate/translate/index.html b/fr/docs/pre-release/participate/translate/index.html index b75e7a6edd7..7df9e521e14 100644 --- a/fr/docs/pre-release/participate/translate/index.html +++ b/fr/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/fr/index.html b/fr/index.html index 751c4f38dbc..8026145238c 100644 --- a/fr/index.html +++ b/fr/index.html @@ -7,13 +7,13 @@ - +

    Ferme de n'importe où

    Gagnez des récompenses en exécutant un nœud agriculteur en promettant un disque inutilisé. Aucune configuration coûteuse ou capital initial n'est requis.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/fr/markdown-page/index.html b/fr/markdown-page/index.html index bcd41b29b66..355adf21db8 100644 --- a/fr/markdown-page/index.html +++ b/fr/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/404.html b/hi/404.html index 33fa14e8ed3..a91cfa19496 100644 --- a/hi/404.html +++ b/hi/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/assets/js/2794361d.c1d5912b.js b/hi/assets/js/2794361d.c1d5912b.js deleted file mode 100644 index 38c42d5f4e9..00000000000 --- a/hi/assets/js/2794361d.c1d5912b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4830],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},9221:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/hi/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/hi/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/hi/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/hi/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/hi/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/hi/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/hi/assets/js/2794361d.dc94b99a.js b/hi/assets/js/2794361d.dc94b99a.js new file mode 100644 index 00000000000..0d9780b57b4 --- /dev/null +++ b/hi/assets/js/2794361d.dc94b99a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4830],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},9221:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/hi/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/hi/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/hi/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/hi/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/hi/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/hi/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/hi/assets/js/c88f475b.801f743f.js b/hi/assets/js/c88f475b.801f743f.js new file mode 100644 index 00000000000..77adac2fae3 --- /dev/null +++ b/hi/assets/js/c88f475b.801f743f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[3084],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},428:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/hi/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/hi/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/hi/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/hi/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/hi/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/hi/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/hi/assets/js/c88f475b.9043ddcc.js b/hi/assets/js/c88f475b.9043ddcc.js deleted file mode 100644 index 8ef531dfd6a..00000000000 --- a/hi/assets/js/c88f475b.9043ddcc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[3084],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},428:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/hi/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/hi/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/hi/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/hi/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/hi/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/hi/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/hi/assets/js/runtime~main.bbea7466.js b/hi/assets/js/runtime~main.1fabe999.js similarity index 98% rename from hi/assets/js/runtime~main.bbea7466.js rename to hi/assets/js/runtime~main.1fabe999.js index 6af5100e3a3..e571528bf1d 100644 --- a/hi/assets/js/runtime~main.bbea7466.js +++ b/hi/assets/js/runtime~main.1fabe999.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",179:"38237399",733:"d278d2c3",1092:"02635269",1398:"31e04bf9",1402:"9d94ca50",1419:"01da2314",1450:"529d04d5",1624:"0f9a57e6",1632:"dfd8fddd",1683:"eca26d5f",1696:"a64109c9",1705:"603a711f",1710:"363a26e7",1753:"d3b40371",1848:"5bea99d2",1872:"4648cb2f",2425:"c7320df1",2509:"175f75c9",2639:"63685a7a",2742:"c9193ae0",2903:"10ec6883",3030:"d9a7dd55",3084:"c88f475b",3085:"1f391b9e",3183:"8f880ce9",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3298:"6b2ce625",3483:"81891eab",3602:"deb81efc",3692:"0855540d",3833:"b0ce434b",3846:"152c9dfa",3876:"db5898fa",3940:"275cfc3a",3979:"49ed9d8a",4007:"6fd71968",4106:"5950fb72",4142:"ebb88f78",4148:"c690a594",4150:"d8dfdf1e",4293:"886aaea0",4357:"c040f5cd",4380:"ee2e3b57",4458:"eab56db4",4622:"5741a225",4803:"82ce563e",4830:"2794361d",4921:"6913db3f",4991:"b9abfadc",5123:"794dd5a9",5331:"ea808b30",5489:"34d1cbb8",5559:"c2731cd4",5610:"3b39712c",5613:"c3683672",5636:"acabd978",5890:"1945c4cb",5898:"852c6391",5994:"5c9454e1",6024:"3519ac4a",6112:"3522c995",6324:"9469a808",6341:"73573976",6413:"715edac3",6433:"39d16dc7",6556:"7691ecd9",6684:"1f1a7c7e",6889:"6ba57331",6971:"caa07ba4",7005:"7ea135ec",7147:"f0b621d8",7209:"26b9adc4",7272:"786642eb",7292:"d17c813d",7348:"7e92dda2",7366:"24844d0d",7370:"c09f4ff7",7386:"1fdddcfe",7414:"393be207",7530:"7371e9bb",7782:"2e054fb0",7845:"00617786",7918:"17896441",8296:"6f12b190",8390:"108f3888",8455:"188dae76",8471:"ea6e4a1d",8699:"32ea141d",9281:"ac8ff4c6",9514:"1be78505",9623:"052636ff",9659:"006036ca",9667:"08f907f6",9817:"14eb3368",9881:"7f94bed1"}[e]||e)+"."+{53:"e6a8d56d",179:"57055ec6",733:"56ef3350",814:"dc8c3a26",1092:"897cae7e",1398:"31b83519",1402:"9f31833c",1419:"71841037",1450:"a5b16d7e",1624:"4310df56",1632:"ca7ae8bf",1683:"9ad2023c",1696:"5ca72da0",1705:"f0649078",1710:"baa16813",1753:"61baaa07",1848:"9fcda5c7",1872:"10acb304",2425:"1ed86731",2509:"be23faf1",2639:"9e0c88e1",2742:"dc925403",2903:"cd825aff",3030:"65bddc28",3084:"9043ddcc",3085:"3a447380",3183:"361ad03b",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3298:"cb52e4fb",3473:"fdffa07c",3483:"1bf376fa",3602:"32be61c9",3692:"f30a4083",3833:"fa1fa335",3846:"d007042d",3876:"41a2368a",3940:"6545e32f",3979:"f16823d1",4007:"2e54534b",4106:"55a3bdbf",4142:"9d62c4d9",4148:"7966e814",4150:"916a5974",4293:"d023327f",4357:"af0595b3",4380:"e1e5abb1",4458:"29aa7239",4622:"aab31540",4803:"da4aa11c",4830:"c1d5912b",4921:"c5c204d6",4972:"4a54fd4a",4991:"2ec0cb56",5123:"e4cdbcea",5331:"924497f5",5489:"eec50696",5559:"6a460fd8",5610:"deaa3621",5613:"01147a72",5636:"58df9446",5890:"207424b8",5898:"7134f6d5",5994:"fa5e6cda",6024:"c3efb664",6112:"227777e9",6324:"ef35a8a8",6341:"97790e2f",6413:"c5e08782",6433:"90430e9a",6556:"dfac81cd",6684:"53539f1c",6889:"bcd10912",6971:"ccbdd59a",7005:"a299911b",7147:"d5abebd8",7209:"eaec0471",7272:"8c48d893",7292:"85475463",7348:"fc534a3f",7366:"f80856c8",7370:"77867790",7386:"5dce056f",7414:"1b720d9c",7530:"5be8a157",7782:"370efd6a",7845:"41deea1d",7918:"e3da5265",8296:"bf3cd60c",8390:"843b9841",8455:"ec118704",8471:"cf443072",8699:"b98805a1",9281:"577bbfbb",9514:"478c02c6",9623:"30a3b2a5",9659:"a4f27ed6",9667:"2815bc59",9817:"b7ea7ab7",9881:"f0327461"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="portal:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/hi/",r.gca=function(e){return e={17896441:"7918",38237399:"179",73573976:"6341","935f2afb":"53",d278d2c3:"733","02635269":"1092","31e04bf9":"1398","9d94ca50":"1402","01da2314":"1419","529d04d5":"1450","0f9a57e6":"1624",dfd8fddd:"1632",eca26d5f:"1683",a64109c9:"1696","603a711f":"1705","363a26e7":"1710",d3b40371:"1753","5bea99d2":"1848","4648cb2f":"1872",c7320df1:"2425","175f75c9":"2509","63685a7a":"2639",c9193ae0:"2742","10ec6883":"2903",d9a7dd55:"3030",c88f475b:"3084","1f391b9e":"3085","8f880ce9":"3183",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","6b2ce625":"3298","81891eab":"3483",deb81efc:"3602","0855540d":"3692",b0ce434b:"3833","152c9dfa":"3846",db5898fa:"3876","275cfc3a":"3940","49ed9d8a":"3979","6fd71968":"4007","5950fb72":"4106",ebb88f78:"4142",c690a594:"4148",d8dfdf1e:"4150","886aaea0":"4293",c040f5cd:"4357",ee2e3b57:"4380",eab56db4:"4458","5741a225":"4622","82ce563e":"4803","2794361d":"4830","6913db3f":"4921",b9abfadc:"4991","794dd5a9":"5123",ea808b30:"5331","34d1cbb8":"5489",c2731cd4:"5559","3b39712c":"5610",c3683672:"5613",acabd978:"5636","1945c4cb":"5890","852c6391":"5898","5c9454e1":"5994","3519ac4a":"6024","3522c995":"6112","9469a808":"6324","715edac3":"6413","39d16dc7":"6433","7691ecd9":"6556","1f1a7c7e":"6684","6ba57331":"6889",caa07ba4:"6971","7ea135ec":"7005",f0b621d8:"7147","26b9adc4":"7209","786642eb":"7272",d17c813d:"7292","7e92dda2":"7348","24844d0d":"7366",c09f4ff7:"7370","1fdddcfe":"7386","393be207":"7414","7371e9bb":"7530","2e054fb0":"7782","00617786":"7845","6f12b190":"8296","108f3888":"8390","188dae76":"8455",ea6e4a1d:"8471","32ea141d":"8699",ac8ff4c6:"9281","1be78505":"9514","052636ff":"9623","006036ca":"9659","08f907f6":"9667","14eb3368":"9817","7f94bed1":"9881"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",179:"38237399",733:"d278d2c3",1092:"02635269",1398:"31e04bf9",1402:"9d94ca50",1419:"01da2314",1450:"529d04d5",1624:"0f9a57e6",1632:"dfd8fddd",1683:"eca26d5f",1696:"a64109c9",1705:"603a711f",1710:"363a26e7",1753:"d3b40371",1848:"5bea99d2",1872:"4648cb2f",2425:"c7320df1",2509:"175f75c9",2639:"63685a7a",2742:"c9193ae0",2903:"10ec6883",3030:"d9a7dd55",3084:"c88f475b",3085:"1f391b9e",3183:"8f880ce9",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3298:"6b2ce625",3483:"81891eab",3602:"deb81efc",3692:"0855540d",3833:"b0ce434b",3846:"152c9dfa",3876:"db5898fa",3940:"275cfc3a",3979:"49ed9d8a",4007:"6fd71968",4106:"5950fb72",4142:"ebb88f78",4148:"c690a594",4150:"d8dfdf1e",4293:"886aaea0",4357:"c040f5cd",4380:"ee2e3b57",4458:"eab56db4",4622:"5741a225",4803:"82ce563e",4830:"2794361d",4921:"6913db3f",4991:"b9abfadc",5123:"794dd5a9",5331:"ea808b30",5489:"34d1cbb8",5559:"c2731cd4",5610:"3b39712c",5613:"c3683672",5636:"acabd978",5890:"1945c4cb",5898:"852c6391",5994:"5c9454e1",6024:"3519ac4a",6112:"3522c995",6324:"9469a808",6341:"73573976",6413:"715edac3",6433:"39d16dc7",6556:"7691ecd9",6684:"1f1a7c7e",6889:"6ba57331",6971:"caa07ba4",7005:"7ea135ec",7147:"f0b621d8",7209:"26b9adc4",7272:"786642eb",7292:"d17c813d",7348:"7e92dda2",7366:"24844d0d",7370:"c09f4ff7",7386:"1fdddcfe",7414:"393be207",7530:"7371e9bb",7782:"2e054fb0",7845:"00617786",7918:"17896441",8296:"6f12b190",8390:"108f3888",8455:"188dae76",8471:"ea6e4a1d",8699:"32ea141d",9281:"ac8ff4c6",9514:"1be78505",9623:"052636ff",9659:"006036ca",9667:"08f907f6",9817:"14eb3368",9881:"7f94bed1"}[e]||e)+"."+{53:"e6a8d56d",179:"57055ec6",733:"56ef3350",814:"dc8c3a26",1092:"897cae7e",1398:"31b83519",1402:"9f31833c",1419:"71841037",1450:"a5b16d7e",1624:"4310df56",1632:"ca7ae8bf",1683:"9ad2023c",1696:"5ca72da0",1705:"f0649078",1710:"baa16813",1753:"61baaa07",1848:"9fcda5c7",1872:"10acb304",2425:"1ed86731",2509:"be23faf1",2639:"9e0c88e1",2742:"dc925403",2903:"cd825aff",3030:"65bddc28",3084:"801f743f",3085:"3a447380",3183:"361ad03b",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3298:"cb52e4fb",3473:"fdffa07c",3483:"1bf376fa",3602:"32be61c9",3692:"f30a4083",3833:"fa1fa335",3846:"d007042d",3876:"41a2368a",3940:"6545e32f",3979:"f16823d1",4007:"2e54534b",4106:"55a3bdbf",4142:"9d62c4d9",4148:"7966e814",4150:"916a5974",4293:"d023327f",4357:"af0595b3",4380:"e1e5abb1",4458:"29aa7239",4622:"aab31540",4803:"da4aa11c",4830:"dc94b99a",4921:"c5c204d6",4972:"4a54fd4a",4991:"2ec0cb56",5123:"e4cdbcea",5331:"924497f5",5489:"eec50696",5559:"6a460fd8",5610:"deaa3621",5613:"01147a72",5636:"58df9446",5890:"207424b8",5898:"7134f6d5",5994:"fa5e6cda",6024:"c3efb664",6112:"227777e9",6324:"ef35a8a8",6341:"97790e2f",6413:"c5e08782",6433:"90430e9a",6556:"dfac81cd",6684:"53539f1c",6889:"bcd10912",6971:"ccbdd59a",7005:"a299911b",7147:"d5abebd8",7209:"eaec0471",7272:"8c48d893",7292:"85475463",7348:"fc534a3f",7366:"f80856c8",7370:"77867790",7386:"5dce056f",7414:"1b720d9c",7530:"5be8a157",7782:"370efd6a",7845:"41deea1d",7918:"e3da5265",8296:"bf3cd60c",8390:"843b9841",8455:"ec118704",8471:"cf443072",8699:"b98805a1",9281:"577bbfbb",9514:"478c02c6",9623:"30a3b2a5",9659:"a4f27ed6",9667:"2815bc59",9817:"b7ea7ab7",9881:"f0327461"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="portal:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/hi/",r.gca=function(e){return e={17896441:"7918",38237399:"179",73573976:"6341","935f2afb":"53",d278d2c3:"733","02635269":"1092","31e04bf9":"1398","9d94ca50":"1402","01da2314":"1419","529d04d5":"1450","0f9a57e6":"1624",dfd8fddd:"1632",eca26d5f:"1683",a64109c9:"1696","603a711f":"1705","363a26e7":"1710",d3b40371:"1753","5bea99d2":"1848","4648cb2f":"1872",c7320df1:"2425","175f75c9":"2509","63685a7a":"2639",c9193ae0:"2742","10ec6883":"2903",d9a7dd55:"3030",c88f475b:"3084","1f391b9e":"3085","8f880ce9":"3183",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","6b2ce625":"3298","81891eab":"3483",deb81efc:"3602","0855540d":"3692",b0ce434b:"3833","152c9dfa":"3846",db5898fa:"3876","275cfc3a":"3940","49ed9d8a":"3979","6fd71968":"4007","5950fb72":"4106",ebb88f78:"4142",c690a594:"4148",d8dfdf1e:"4150","886aaea0":"4293",c040f5cd:"4357",ee2e3b57:"4380",eab56db4:"4458","5741a225":"4622","82ce563e":"4803","2794361d":"4830","6913db3f":"4921",b9abfadc:"4991","794dd5a9":"5123",ea808b30:"5331","34d1cbb8":"5489",c2731cd4:"5559","3b39712c":"5610",c3683672:"5613",acabd978:"5636","1945c4cb":"5890","852c6391":"5898","5c9454e1":"5994","3519ac4a":"6024","3522c995":"6112","9469a808":"6324","715edac3":"6413","39d16dc7":"6433","7691ecd9":"6556","1f1a7c7e":"6684","6ba57331":"6889",caa07ba4:"6971","7ea135ec":"7005",f0b621d8:"7147","26b9adc4":"7209","786642eb":"7272",d17c813d:"7292","7e92dda2":"7348","24844d0d":"7366",c09f4ff7:"7370","1fdddcfe":"7386","393be207":"7414","7371e9bb":"7530","2e054fb0":"7782","00617786":"7845","6f12b190":"8296","108f3888":"8390","188dae76":"8455",ea6e4a1d:"8471","32ea141d":"8699",ac8ff4c6:"9281","1be78505":"9514","052636ff":"9623","006036ca":"9659","08f907f6":"9667","14eb3368":"9817","7f94bed1":"9881"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/hi/docs/category/advanced-cli/index.html b/hi/docs/category/advanced-cli/index.html index 0e773bd7929..64e4a37a86f 100644 --- a/hi/docs/category/advanced-cli/index.html +++ b/hi/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/category/develop-on-nova-evm-/index.html b/hi/docs/category/develop-on-nova-evm-/index.html index 4e0e1ad2deb..1e02b544fd2 100644 --- a/hi/docs/category/develop-on-nova-evm-/index.html +++ b/hi/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/hi/docs/category/develop/index.html b/hi/docs/category/develop/index.html index a2acf369aa7..da91a7637b2 100644 --- a/hi/docs/category/develop/index.html +++ b/hi/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/category/farming/index.html b/hi/docs/category/farming/index.html index 10846c217d6..b23c102ee14 100644 --- a/hi/docs/category/farming/index.html +++ b/hi/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/category/learn/index.html b/hi/docs/category/learn/index.html index ee0d261e796..88d89601d19 100644 --- a/hi/docs/category/learn/index.html +++ b/hi/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/category/operators-and-nominators/index.html b/hi/docs/category/operators-and-nominators/index.html index b1bf440c563..91420f04dd1 100644 --- a/hi/docs/category/operators-and-nominators/index.html +++ b/hi/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/category/participate/index.html b/hi/docs/category/participate/index.html index f4183bb71f4..304cc26ad13 100644 --- a/hi/docs/category/participate/index.html +++ b/hi/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/category/pulsar-recommended/index.html b/hi/docs/category/pulsar-recommended/index.html index 83b395bd7fa..fac2f02314c 100644 --- a/hi/docs/category/pulsar-recommended/index.html +++ b/hi/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/category/wallets/index.html b/hi/docs/category/wallets/index.html index a8887f5f8f3..8ed596b5e71 100644 --- a/hi/docs/category/wallets/index.html +++ b/hi/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/develop/nova/block_explorer/index.html b/hi/docs/develop/nova/block_explorer/index.html index a9977c9e749..5b1a605f364 100644 --- a/hi/docs/develop/nova/block_explorer/index.html +++ b/hi/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/develop/nova/faucet/index.html b/hi/docs/develop/nova/faucet/index.html index 56ed97f7699..790249f8a22 100644 --- a/hi/docs/develop/nova/faucet/index.html +++ b/hi/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/hi/docs/develop/nova/foundry_guide/index.html b/hi/docs/develop/nova/foundry_guide/index.html index cfd8d533b96..6de55386eb3 100644 --- a/hi/docs/develop/nova/foundry_guide/index.html +++ b/hi/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/hi/docs/develop/nova/general-information/index.html b/hi/docs/develop/nova/general-information/index.html index be7eb450d08..16f8394865a 100644 --- a/hi/docs/develop/nova/general-information/index.html +++ b/hi/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/hi/docs/develop/nova/hardhat_guide/index.html b/hi/docs/develop/nova/hardhat_guide/index.html index 2b5e186c2e7..23d3aea7819 100644 --- a/hi/docs/develop/nova/hardhat_guide/index.html +++ b/hi/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/hi/docs/develop/nova/intro/index.html b/hi/docs/develop/nova/intro/index.html index 4fbab3b5dcf..c86be7dfb0f 100644 --- a/hi/docs/develop/nova/intro/index.html +++ b/hi/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/hi/docs/develop/nova/local_development/index.html b/hi/docs/develop/nova/local_development/index.html index f266f435073..0d07f275606 100644 --- a/hi/docs/develop/nova/local_development/index.html +++ b/hi/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/hi/docs/develop/nova/quick_start/index.html b/hi/docs/develop/nova/quick_start/index.html index c01834f2fb2..7f7fc190005 100644 --- a/hi/docs/develop/nova/quick_start/index.html +++ b/hi/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/hi/docs/develop/nova/remix_guide/index.html b/hi/docs/develop/nova/remix_guide/index.html index c6cbf8976a6..cdc00d99c0d 100644 --- a/hi/docs/develop/nova/remix_guide/index.html +++ b/hi/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/hi/docs/develop/nova/setting-up-metamask/index.html b/hi/docs/develop/nova/setting-up-metamask/index.html index e291c6bcdb6..2883ddeb596 100644 --- a/hi/docs/develop/nova/setting-up-metamask/index.html +++ b/hi/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/hi/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 55c344255fc..e852dbb8960 100644 --- a/hi/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/hi/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/hi/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 9eae7fa69e4..5e77138a438 100644 --- a/hi/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/hi/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/hi/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index d6bf8af880d..2fc96ded188 100644 --- a/hi/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/hi/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/hi/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 38d8279c0e1..fc788fc87ac 100644 --- a/hi/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/hi/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/hi/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 53436bc764f..3044430df4f 100644 --- a/hi/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/hi/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/common_problems/index.html b/hi/docs/farming-&-staking/farming/common_problems/index.html index 5af70750bf7..19646367081 100644 --- a/hi/docs/farming-&-staking/farming/common_problems/index.html +++ b/hi/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/hi/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 948e15795e3..d294558c27a 100644 --- a/hi/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/hi/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/hi/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index d0d07a12ad0..9dd8d61158f 100644 --- a/hi/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/hi/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/hi/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 3652ade2859..84716e43133 100644 --- a/hi/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/hi/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/hi/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 2f24ddfeedf..cda75d76aba 100644 --- a/hi/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/hi/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/index.html b/hi/docs/farming-&-staking/index.html index fa38eb909dd..41bd3d27527 100644 --- a/hi/docs/farming-&-staking/index.html +++ b/hi/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/staking/index.html b/hi/docs/farming-&-staking/staking/index.html index 538c69f3dd3..a4a18823fe0 100644 --- a/hi/docs/farming-&-staking/staking/index.html +++ b/hi/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/staking/intro/index.html b/hi/docs/farming-&-staking/staking/intro/index.html index 81f67df1cc2..1aad412b7d8 100644 --- a/hi/docs/farming-&-staking/staking/intro/index.html +++ b/hi/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/staking/operators/index.html b/hi/docs/farming-&-staking/staking/operators/index.html index 01dda6d31c2..6682bd2a500 100644 --- a/hi/docs/farming-&-staking/staking/operators/index.html +++ b/hi/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/timekeeping/index.html b/hi/docs/farming-&-staking/timekeeping/index.html index dbaa6baa1ff..470a1c8fad7 100644 --- a/hi/docs/farming-&-staking/timekeeping/index.html +++ b/hi/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/wallets/polkadot/index.html b/hi/docs/farming-&-staking/wallets/polkadot/index.html index f20364bf607..132e7ab9386 100644 --- a/hi/docs/farming-&-staking/wallets/polkadot/index.html +++ b/hi/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/hi/docs/farming-&-staking/wallets/subwallet/index.html b/hi/docs/farming-&-staking/wallets/subwallet/index.html index d6f40a2ba3d..2f8eca52ee8 100644 --- a/hi/docs/farming-&-staking/wallets/subwallet/index.html +++ b/hi/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/hi/docs/learn/intro/index.html b/hi/docs/learn/intro/index.html index 2230a52dcf3..129f8ce6ed0 100644 --- a/hi/docs/learn/intro/index.html +++ b/hi/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/hi/docs/learn/security/index.html b/hi/docs/learn/security/index.html index 366e4d9ab92..9d0827439ff 100644 --- a/hi/docs/learn/security/index.html +++ b/hi/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/hi/docs/learn/subnomicon/index.html b/hi/docs/learn/subnomicon/index.html index 7fcf203dfac..7c494cc9bb7 100644 --- a/hi/docs/learn/subnomicon/index.html +++ b/hi/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/hi/docs/participate/CODE_OF_CONDUCT/index.html b/hi/docs/participate/CODE_OF_CONDUCT/index.html index db4d04db843..04b6ef98b24 100644 --- a/hi/docs/participate/CODE_OF_CONDUCT/index.html +++ b/hi/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/hi/docs/participate/contribute/index.html b/hi/docs/participate/contribute/index.html index 5ddd5e51196..ae12b08e033 100644 --- a/hi/docs/participate/contribute/index.html +++ b/hi/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/hi/docs/participate/index.html b/hi/docs/participate/index.html index 9a6af24cdc8..915a89a31dc 100644 --- a/hi/docs/participate/index.html +++ b/hi/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/hi/docs/participate/translate/index.html b/hi/docs/participate/translate/index.html index 97d4277db9c..f3501c12f55 100644 --- a/hi/docs/participate/translate/index.html +++ b/hi/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/additional-guides/index.html b/hi/docs/pre-release/category/additional-guides/index.html index 11c825c6551..d5d2bdc727f 100644 --- a/hi/docs/pre-release/category/additional-guides/index.html +++ b/hi/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/advanced-cli/index.html b/hi/docs/pre-release/category/advanced-cli/index.html index 305f3c0ebcb..e58f2b87270 100644 --- a/hi/docs/pre-release/category/advanced-cli/index.html +++ b/hi/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/develop-on-nova-evm-/index.html b/hi/docs/pre-release/category/develop-on-nova-evm-/index.html index b63eb5d3b54..b2dcf38cbbb 100644 --- a/hi/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/hi/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/develop/index.html b/hi/docs/pre-release/category/develop/index.html index b15255d7241..47906fbce65 100644 --- a/hi/docs/pre-release/category/develop/index.html +++ b/hi/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/farming/index.html b/hi/docs/pre-release/category/farming/index.html index 40a7af43c57..e9c103284dd 100644 --- a/hi/docs/pre-release/category/farming/index.html +++ b/hi/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/learn/index.html b/hi/docs/pre-release/category/learn/index.html index 3b762de639b..5988974f303 100644 --- a/hi/docs/pre-release/category/learn/index.html +++ b/hi/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/operators-and-nominators/index.html b/hi/docs/pre-release/category/operators-and-nominators/index.html index 370a8d942f6..aefd90de501 100644 --- a/hi/docs/pre-release/category/operators-and-nominators/index.html +++ b/hi/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/participate/index.html b/hi/docs/pre-release/category/participate/index.html index 2801125e831..90cfa201f0e 100644 --- a/hi/docs/pre-release/category/participate/index.html +++ b/hi/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/pulsar-recommended/index.html b/hi/docs/pre-release/category/pulsar-recommended/index.html index ede2a4edc73..c2a1ed28e0d 100644 --- a/hi/docs/pre-release/category/pulsar-recommended/index.html +++ b/hi/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/category/wallets/index.html b/hi/docs/pre-release/category/wallets/index.html index e4a1fbafa36..c9cad0f8378 100644 --- a/hi/docs/pre-release/category/wallets/index.html +++ b/hi/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/block_explorer/index.html b/hi/docs/pre-release/develop/nova/block_explorer/index.html index a9a89405821..21655a5ae4a 100644 --- a/hi/docs/pre-release/develop/nova/block_explorer/index.html +++ b/hi/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/faucet/index.html b/hi/docs/pre-release/develop/nova/faucet/index.html index 78fc15ead15..5a5c561f157 100644 --- a/hi/docs/pre-release/develop/nova/faucet/index.html +++ b/hi/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/foundry_guide/index.html b/hi/docs/pre-release/develop/nova/foundry_guide/index.html index efc1068a9d5..770dac88242 100644 --- a/hi/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/hi/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/general-information/index.html b/hi/docs/pre-release/develop/nova/general-information/index.html index c6aae9d6445..9900b813daa 100644 --- a/hi/docs/pre-release/develop/nova/general-information/index.html +++ b/hi/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/hardhat_guide/index.html b/hi/docs/pre-release/develop/nova/hardhat_guide/index.html index 994fe3d8e4c..965ba037d4b 100644 --- a/hi/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/hi/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/intro/index.html b/hi/docs/pre-release/develop/nova/intro/index.html index 88f80937579..a899b7158e5 100644 --- a/hi/docs/pre-release/develop/nova/intro/index.html +++ b/hi/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/local_development/index.html b/hi/docs/pre-release/develop/nova/local_development/index.html index f060739eb1b..07f69796f64 100644 --- a/hi/docs/pre-release/develop/nova/local_development/index.html +++ b/hi/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/quick_start/index.html b/hi/docs/pre-release/develop/nova/quick_start/index.html index bf4de9399f9..2ef74d464d6 100644 --- a/hi/docs/pre-release/develop/nova/quick_start/index.html +++ b/hi/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/remix_guide/index.html b/hi/docs/pre-release/develop/nova/remix_guide/index.html index 49c583bec71..79d979a0de3 100644 --- a/hi/docs/pre-release/develop/nova/remix_guide/index.html +++ b/hi/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/develop/nova/setting-up-metamask/index.html b/hi/docs/pre-release/develop/nova/setting-up-metamask/index.html index 9279df4bf03..21d6f51dffc 100644 --- a/hi/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/hi/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/hi/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 7535042cb28..294b20c36d8 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index d4be7f90584..4e424a70887 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 343a90bc606..ba7e567dc48 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index a03837c4068..fc5104cfc91 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 4af07767ee8..0ef3b5a3878 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/hi/docs/pre-release/farming-&-staking/farming/common_problems/index.html index e502ca1b127..eafd2b0f563 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 2cb143f5f82..2391a54440b 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 352514f37c4..eca83fc4d0c 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index e88a2776672..e1da84b2e1a 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index b33fa4a1046..5b5ba8ea0af 100644 --- a/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/hi/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/index.html b/hi/docs/pre-release/farming-&-staking/index.html index 06b25fa2ebc..0edf1bdf8cc 100644 --- a/hi/docs/pre-release/farming-&-staking/index.html +++ b/hi/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/staking/index.html b/hi/docs/pre-release/farming-&-staking/staking/index.html index 1aad83080d4..5e938a8a7eb 100644 --- a/hi/docs/pre-release/farming-&-staking/staking/index.html +++ b/hi/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/staking/intro/index.html b/hi/docs/pre-release/farming-&-staking/staking/intro/index.html index 7802eb59541..48b18dc7a05 100644 --- a/hi/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/hi/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/staking/operators/index.html b/hi/docs/pre-release/farming-&-staking/staking/operators/index.html index 213f6a05d58..4ffe1961eba 100644 --- a/hi/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/hi/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/timekeeping/index.html b/hi/docs/pre-release/farming-&-staking/timekeeping/index.html index 190192a9e69..bfb66178780 100644 --- a/hi/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/hi/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/hi/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 30f7e1ff502..31af90918b6 100644 --- a/hi/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/hi/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/hi/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index cfbb8197b24..8485d0a99d4 100644 --- a/hi/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/hi/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/learn/intro/index.html b/hi/docs/pre-release/learn/intro/index.html index e5d94bc174d..b6135783a86 100644 --- a/hi/docs/pre-release/learn/intro/index.html +++ b/hi/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/learn/security/index.html b/hi/docs/pre-release/learn/security/index.html index f2ce09f2e15..0165adfe675 100644 --- a/hi/docs/pre-release/learn/security/index.html +++ b/hi/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/learn/subnomicon/index.html b/hi/docs/pre-release/learn/subnomicon/index.html index 9654a97a80d..93e08742cb7 100644 --- a/hi/docs/pre-release/learn/subnomicon/index.html +++ b/hi/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/hi/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 4a16bc54d04..cc44f111839 100644 --- a/hi/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/hi/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/participate/contribute/index.html b/hi/docs/pre-release/participate/contribute/index.html index d342b78680d..a247da7a8fd 100644 --- a/hi/docs/pre-release/participate/contribute/index.html +++ b/hi/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/hi/docs/pre-release/participate/index.html b/hi/docs/pre-release/participate/index.html index 8944f067fac..e63d544c76f 100644 --- a/hi/docs/pre-release/participate/index.html +++ b/hi/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/hi/docs/pre-release/participate/translate/index.html b/hi/docs/pre-release/participate/translate/index.html index 48e565bdc5a..a5bc4dd85d3 100644 --- a/hi/docs/pre-release/participate/translate/index.html +++ b/hi/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/hi/index.html b/hi/index.html index d4e2f7bd5bf..091758e53e4 100644 --- a/hi/index.html +++ b/hi/index.html @@ -7,13 +7,13 @@ - +

    कहीं से भी खेती करें

    स्पेयर डिस्क की प्रतिज्ञा करके एक किसान नोड चलाकर इनाम कमाएं। महंगी स्थापना या अग्रिम पूंजी की आवश्यकता नहीं है।

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/hi/markdown-page/index.html b/hi/markdown-page/index.html index 6e0ff964f46..45f6c749ba8 100644 --- a/hi/markdown-page/index.html +++ b/hi/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/404.html b/id/404.html index dda64e45c06..704a96a14de 100644 --- a/id/404.html +++ b/id/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/assets/js/61031030.2e408167.js b/id/assets/js/61031030.2e408167.js deleted file mode 100644 index 2aa865344a2..00000000000 --- a/id/assets/js/61031030.2e408167.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[7840],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7499:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/id/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/id/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/id/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/id/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/id/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/id/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/id/assets/js/61031030.bf60a6bc.js b/id/assets/js/61031030.bf60a6bc.js new file mode 100644 index 00000000000..3685766b2ac --- /dev/null +++ b/id/assets/js/61031030.bf60a6bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[7840],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7499:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/id/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/id/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/id/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/id/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/id/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/id/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/id/assets/js/99590063.7772fff9.js b/id/assets/js/99590063.7772fff9.js new file mode 100644 index 00000000000..c87a62344e6 --- /dev/null +++ b/id/assets/js/99590063.7772fff9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[292],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8500:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/id/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/id/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/id/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/id/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/id/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/id/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZEAAABOCAYAAADhPisZAAAK0mlDQ1BJQ0MgUHJvZmlsZQAASImVlwdUU9kWhs+96SGhJICAlNB7bwGkhB5AeheVkAQSSowJQcSuDI7gWFARAWVAB0EUHB2K2BBRLAwCFuwTZBBRn4MFGyrvAo8wM2+999bba52cb+3ss8/eZ91z138BIPuyhMJMWBGALEG2KDLAmxafkEjDjQACoABloA+sWWyxkBEeHgIQm53/au/vAGhqvmk5levf//+vRuFwxWwAoCSEUzhidhbC7ch4yhaKsgFA1SJ+/RXZwinuRlhZhBSIsHSK02b43RSnTDMaPx0THemDsCYAeBKLJUoDgGSC+Gk57DQkDykQYRsBhy9AOBdhDzaPxUG4FWGLrKxlU/w7wiZIvBAAMglhesqfcqb9JX+KLD+LlSbjmb6mDe/LFwszWSv/z6P535aVKZndwwgZJJ4oMBKZ5ZHzu5uxLFjGgpTQsFnmc6bjp5knCYyZZbbYJ3GWOSzfYNnazNCQWU7l+zNlebKZ0bPMFftFzbJoWaRsr1SRD2OWWaK5fSUZMTI/j8uU5c/jRcfNcg4/NnSWxRlRwXMxPjK/SBIpq58rCPCe29df1nuW+E/98pmytdm86EBZ76y5+rkCxlxOcbysNg7X128uJkYWL8z2lu0lzAyXxXMzA2R+cU6UbG028nDOrQ2XnWE6Kyh8lkEgCAc0YAccABcg9Wdzc7OnmvBZJlwp4qfxsmkM5KZxaUwB28qCZmdjZw/A1L2deRTe3pi+j5BaypyPi2Sx70ScjDkf/wUAp6uQK6g45zNGHlLFcgDOP2RLRDkzPvTUDwYQgQLyRlAH2shbwQRYItU5ATfgBfxAEAgD0SABLAFswANZQARWgNVgAygARWAH2APKQCU4CGrBMXACtIAz4AK4DK6DXnAbPABSMAxegDHwHkxAEISDyBAVUod0IEPIHLKD6JAH5AeFQJFQApQMpUECSAKthjZBRVAxVAZVQXXQz9Ap6AJ0FeqD7kGD0Cj0BvoMo2ASrAxrwUawNUyHGXAwHA0vhtPg5XAenA9vg0vhavgo3AxfgK/Dt2Ep/AIeRwGUHEoVpYuyRNFRPqgwVCIqFSVCrUUVokpQ1agGVBuqC3UTJUW9RH1CY9FUNA1tiXZDB6Jj0Gz0cvRa9FZ0GboW3YzuRN9ED6LH0N8wZIwmxhzjimFi4jFpmBWYAkwJpgbThLmEuY0ZxrzHYrGqWGOsMzYQm4BNx67CbsXuxzZi27F92CHsOA6HU8eZ49xxYTgWLhtXgNuHO4o7j+vHDeM+4uXwOng7vD8+ES/Ab8SX4I/gz+H78SP4CYIiwZDgSggjcAgrCdsJhwhthBuEYcIEUYloTHQnRhPTiRuIpcQG4iXiQ+JbOTk5PTkXuQg5vtx6uVK543JX5AblPpEoJDOSDymJJCFtIx0mtZPukd6SyWQjshc5kZxN3kauI18kPyZ/lKfKW8kz5Tny6+TL5Zvl++VfKRAUDBUYCksU8hRKFE4q3FB4qUhQNFL0UWQprlUsVzylOKA4rkRVslUKU8pS2qp0ROmq0jMKjmJE8aNwKPmUg5SLlCEqiqpP9aGyqZuoh6iXqMPKWGVjZaZyunKR8jHlHuUxFYqKg0qsSq5KucpZFakqStVIlamaqbpd9YTqHdXP87TmMeZx522Z1zCvf94HtflqXmpctUK1RrXbap/Vaep+6hnqO9Vb1B9poDXMNCI0Vmgc0Lik8XK+8ny3+ez5hfNPzL+vCWuaaUZqrtI8qNmtOa6lrRWgJdTap3VR66W2qraXdrr2bu1z2qM6VB0PHb7Obp3zOs9pKjQGLZNWSuukjelq6gbqSnSrdHt0J/SM9WL0Nuo16j3SJ+rT9VP1d+t36I8Z6BgsNFhtUG9w35BgSDfkGe417DL8YGRsFGe02ajF6JmxmjHTOM+43vihCdnE02S5SbXJLVOsKd00w3S/aa8ZbOZoxjMrN7thDps7mfPN95v3WWAsXCwEFtUWA5YkS4ZljmW95aCVqlWI1UarFqtX1gbWidY7rbusv9k42mTaHLJ5YEuxDbLdaNtm+8bOzI5tV253y55s72+/zr7V/rWDuQPX4YDDXUeq40LHzY4djl+dnJ1ETg1Oo84GzsnOFc4DdGV6OH0r/YoLxsXbZZ3LGZdPrk6u2a4nXP9ws3TLcDvi9myB8QLugkMLhtz13FnuVe5SD5pHssePHlJPXU+WZ7XnEy99L45XjdcIw5SRzjjKeOVt4y3ybvL+4OPqs8an3RflG+Bb6NvjR/GL8Svze+yv55/mX+8/FuAYsCqgPRATGBy4M3CAqcVkM+uYY0HOQWuCOoNJwVHBZcFPQsxCRCFtC+GFQQt3LXwYahgqCG0JA2HMsF1hj8KNw5eHn47ARoRHlEc8jbSNXB3ZFUWNWhp1JOp9tHf09ugHMSYxkpiOWIXYpNi62A9xvnHFcdJ46/g18dcTNBL4Ca2JuMTYxJrE8UV+i/YsGk5yTCpIurPYeHHu4qtLNJZkLjm7VGEpa+nJZExyXPKR5C+sMFY1azyFmVKRMsb2Ye9lv+B4cXZzRrnu3GLuSKp7anHqszT3tF1pozxPXgnvJd+HX8Z/nR6YXpn+ISMs43DGZGZcZmMWPis565SAIsgQdC7TXpa7rE9oLiwQSpe7Lt+zfEwULKoRQ+LF4tZsZUQgdUtMJN9JBnM8cspzPq6IXXEyVylXkNu90mzllpUjef55P61Cr2Kv6litu3rD6sE1jDVVa6G1KWs71umvy183vD5gfe0G4oaMDb9utNlYvPHdprhNbfla+evzh74L+K6+QL5AVDCw2W1z5ffo7/nf92yx37Jvy7dCTuG1IpuikqIvW9lbr/1g+0PpD5PbUrf1bHfafmAHdodgx52dnjtri5WK84qHdi3c1bybtrtw97s9S/dcLXEoqdxL3CvZKy0NKW3dZ7Bvx74vZbyy2+Xe5Y0VmhVbKj7s5+zvP+B1oKFSq7Ko8vOP/B/vVgVUNVcbVZccxB7MOfj0UOyhrp/oP9XVaNQU1Xw9LDgsrY2s7axzrqs7onlkez1cL6kfPZp0tPeY77HWBsuGqkbVxqLj4Ljk+POfk3++cyL4RMdJ+smGXwx/qWiiNhU2Q80rm8daeC3S1oTWvlNBpzra3NqaTludPnxG90z5WZWz288Rz+Wfmzyfd368Xdj+8kLahaGOpR0PLsZfvNUZ0dlzKfjSlcv+ly92MbrOX3G/cuaq69VT1+jXWq47XW/uduxu+tXx16Yep57mG843Wntdetv6FvSd6/fsv3DT9+blW8xb12+H3u67E3Pn7kDSgPQu5+6ze5n3Xt/PuT/xYP1DzMPCR4qPSh5rPq7+zfS3RqmT9Oyg72D3k6gnD4bYQy9+F//+ZTj/KflpyYjOSN0zu2dnRv1He58vej78Qvhi4mXBP5T+UfHK5NUvf3j90T0WPzb8WvR68s3Wt+pvD79zeNcxHj7++H3W+4kPhR/VP9Z+on/q+hz3eWRixRfcl9Kvpl/bvgV/eziZNTkpZIlY01IAhQw4NRWAN4cRXZwAALUXAOKiGV09bdDMt8A0gf/EM9p72pwAqGkHIBbBKVlUMaVBkKGwHoApOYTII9jeXjb+ZeJUe7uZXCQNRJq0T06+mQQAlwzA157JyYnSycmvJTPfBedDZ/T8lOmNIRpoSudAA6NbwN9tRuv/qce/z0BWwV/mfwJHChVbDtPk/gAAAGJlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA5KGAAcAAAASAAAAUKACAAQAAAABAAABkaADAAQAAAABAAAATgAAAABBU0NJSQAAAFNjcmVlbnNob3Tg3lotAAACPGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+Nzg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NDAxPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Ct+LN4UAABcMSURBVHgB7Z0JmBRFlscf0NDcIDR3NyDQXM0h54LIjRxyiKLsKCAqOg4znrMz4+zst7uzuuuuOqijszMCyiGHct80pxwKtFxCt9wsct+nzdU0yMY/iiiStKsqO6uqO2v4v/66KiszMiLyly/ixXsRWVXgUuaFm0IhARIgARIgARcECro4h6eQAAmQAAmQgCZAI0JFIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE0gzvWZPJEE7lICxVs0ukuvnJf990bg8qbvwr4keiJhI2QGJEACJHD3EqAncvfee155mAQiMYoLswo8nQRcEYikN01PxNUt4EkkQAIkQAIgQCNCPSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkENO/J7J9/RHJSDsk+7adlBOHLsjFC1n6jpYsEy+VkspIrZSK0rhNkjRsXY13mgQ8RYC666nbwcqEQaDApcwLN8M4P19OXTFzuyybuk2OHzjvqPzKNcpKt4Ep0vnRho7SMxEJBCNgftDHzY9SUXeDkeWxvCIQjg7b6xhTRuTAztMy+b21sjfjhP06HH2u07iSPPnr+6VG/QRH6ZmIBHIi4KYBUndzIsl9+UXAjQ4HqmvMzImsX7ZP3hw227UBAQAYH+SBvCgkkFcEqLt5RZrl5AeBmJgTQSMc+a/LI8Ln5o83/Xm17lYrInkyExIIRIC6G4gM9/+9EPC8J4IwwKh//zLivJEn8qaQQLQIUHejRZb5eomA540I5kDgPURakCfyppBAtAhQd6NFlvl6iYCnjQhWsridRE9uUlnwH0yQN8qgkECkCVB3I02U+XmVgKfnRLCM16289HYv/6mpk7bI3vRjsif9uH+f2UAZXPpraPA9UgSou5EiyXy8TsCznggexnL6HAgg270OGA7z32vQfdJrULMc7wXKQFlO5NKlS3LgwAG5fPmyk+T+NFeuXJEVK1fKxYsX/fvC3di0+VvZsnWr42xu3rwpN278mGP6GzduCI6HKwcPHZKlyyKzAMJtXdZv2CD71T3KT/Gi7l67dk1wf86dO5drNGvXrpPDh521ESeZ51ZPoLfQ0Zz/c9ZpJ/XwSprc8vBKvU09POuJ4El0p9JrcDNlJO7zGY2J3+rTUm+940Ny48pSJ0hoC2UFe6r9h8xMGTtuvJw8edJfpSpVqsjTTw2RkiVL+vcF2oDxWLb8S6mbXNdR+kD5WPcvV/kVLFRQ7mvaVO9e/dXXUq9uXalUqaI1mX97+oxZsn//9/Lb3/yTf5/Z+Lc//of0fughub9tG7PL1fvGjZtk0+bN8kC7+6VYsWKu8gj3JHBuft99UrNGjXCzcn2+l3QXHe+MmbNka3q6/3qKxheVoUOHSPWkJP++YBuLly6Vzp06SWJiZL75wa4nBw4elBMnTkjrVq1yrMYf33hDfvwxZ2NRtkyZHHU6x4w8sjM9PUPii8br9ooq2Xl4pJqOq+FZI4KvMnEqMBIQGBKI1YDoHSFeQpUFA5J1NUuefXqo6qQrydGjx2T6zJkyRu1/+cVfhcg9OodfevGX/ozhRSxeskSKKsUMZET8iaO48XC/vtK1a5d8MyBRvLRcZR1Kn6yZRVt3Fy9ZKhnffScDHn1U6tSuJZmZF2VhaqqM/uRT+cPvX8+Xe2XXk+3bdwg8yEBG5Llnn5Ebt4zI9OkzpVSpktKjR3eNMb5IvBVnTGyvXL1aypcr5zcidh4xcRGWSnrWiOC7sAIJPA/T+JDG6mW4MSTBysIICB5Ixw4dpHbt2rpKdesmy/AXfi5Hjx3Tn/9v3z6ZPPkLef13v5EiRYrofWlp30jaN+vl1Vde0p/xcuToEZk6bbqcPXdWqlWtKr169pAat0bMkz+fohp0UR3y2r1nj5QuVUoGDxok6RkZsnbdOilYsKC0aN5c+vR+SOc3b/4CKVy4sLR/oJ387eNR/n1Lly6Xf/nD7/VnNy+oR/HixQQhuJ27dklcoTjp1KmjLgf5wWClLlos3367Ra5mXZUqlSvL4489JhUqJGgvZM2adfLaqy/roo8dOy4LFi4UjDRLlSylr3f2nLky9KnBUr16dQlVFjJZB47q//yF89q7gMdUsWIFnT9CNDNnzZZdu3frz926dNHv+f0STJ/yUnfBYZ/STQx8mjfzDbBKly6t+A+RPXv36tH99evX5e13/iQDHx8gycnJGt3x48eVkRkjGKiULVtW70MId8zYcfL9/v1yj9rX/oEHpFWrlvrY2nVpsnHTJmmU0lC++nqN3tevbx+tn3PmzNN6UkPd7yGDB0l8fPwdegIvCWFZtLM3//OtO3RNZ6ReTBvB56KqjeAaat17rzms9QgDqAs//KCvd9ATT0i9enUF3vr6jRu1Lpe7p5w80v9hqVnT56G+9T9vS/t27WSral/wgqCfAwY8IrVr1dL5gsH0GTPlhGr78NzatGktXW/pF9rGrNlzFcM9ut5oy0/87B+VcSulzz1/4YLMmzdf9n3/vW4/dVWE4JH+/SQuLk7ee/8DOXP2rC4T1wuPEGVZ2w3Cd/Pmz5edO3dJ1rUsrfd9+/SWcsrwQELVXSfKwxfPzomYL1PMiQUMBQyH+benwXH7HIk9jfVzsLLQeVesWFE1jq9ljYoNY14Ecs8990hKw4Z6+1rWNd1QrC73latXlFLfaQjnzJ2nDFEt6d2rlxoRZmpPBqEyyAXVSaIhQtH69e0rV5Xn89ePP5atW9OV4eitRy3r0tJ04/elvyA/qEYDxe3Tx2dYGjdu7DcyOlMXL6jHBtXwrmZlyUM9e6rrLCuLFi+WLPUZAsO4Zu1a6dSxgzIeAzSPcePH62OXL1/RnT0+oNP55NMxcvLUKWU8ekrTpk1k6vTpmlN2drZOH6osdC7zFyxQnUh1ncfp06f1CPrq1av6/M+/mKJH2fe3bStdOneWL1es9N8fnSCfXoLpU17qLi6/luoUj6nBDnTv1Cnfc1EY6EB3S5QooTvBy1cuq87qmp9WdvZ1fZ+uX7/h34d7jgFEvz59pIwKIc2eqzpRNdiB4F6jI874bpsOi1ZISNAd8LTpM7SedFaDEBgf3B9f+tt60rJFc7m3Zk09SOrbt7cK+foMmU7o8AV6hDBqltKLXj16aKO5adNmWbFqlTRRbQIdMOTTsWP984Jox4uU9w5j1L1bN4FOzp0731/iyNGfiBQoIDBIzZs303X/Tl0fBAOhHTt3aKMCw3JMGYFJkz/XxzCwGa3O3b//gGBQ00JdX3pGukyZOk0f7979Qc0dfQquFx6Jtd0g0TTVTtAGce6DXbuqwedRGTX6U38bDFV3XVAevnjWEwmXQZ0mVXJcjeUmX4zcxowZq8MACAWUKV1GWrduqWL/7XSn7zTPli1aKAPRRydv0KC+vPOnEZKh4qPt1BwCBPFdjGggaLBzVEMdPOhJqVq1iqCxISxx5MhRSa5TR6fBC0Z2mBfBqKmm6mzRWYcr6Fww31NANSKM6N4d8Z5qNDt1OYcOH741MvsHKVSokG6EMBR22blrt+6IXvvFK5KQUF4fRr6pixbdkTRYWZjfaNiggTz6SH99TsOGDdSo+V3ZvXuP1KlTW+CxwUBhDgZSo3qS6MavP8XuSyR1t4fqtM6cOaPDRQgZwYA0b9ZMOnRor/S4tGNIGDQ9+8zTWifQuY147335Wg2qjPeCjJ4f9qzyYosrnagpI9SIG4bd6Dbu2WGlO3aBl4H5ReiVmd+zp3HyGZ7ECz9/XtcP6eFxDH/hBf88DryxUapzh0FNTPTN7cDAPNSrp84ec3iz5swRDOoKKr2HMWipPP/69evp/xTlZaEMCNr9g8rwGL3Ozr4mK1et1sfg4cETefGXw/V1YScMxrZtPgPUKCVFGyQYj5yuF4M1tHMM4Ay75OQ68sGHH2m9b9y4kS4nUN0Rwchr8awRwde5Z57zjTjtULDqKlA4C2n1qizLxLr9fPtnlBVM0Ln/+rVXtQKiM12/fqNehbRLdZRQXKcCw2EEozk0TIwyjFRVbrGREiWK602jqOjQ4VYj/BBtSaxWzd8YEc6Ad3T2rG9VTxOlxFuVh/DWf78taFhQaqtRM3U7cuSIrq+pP/bXr1fvJ0YkUFnw6rCSCP9mlGfyPqzyLlGyhP5YXxk5IwiRwXPMb/GS7sLQI4yEUM+2bdv1vUv75hvZsmWr0ulXdMjJCS/cO+ggBIwRotm2/fYzVjBOMCAQDAwgFSv4wo7YhscMzzlaAsNg6ocyEpQ3hA59/oKFqtxMFXr2tTN0+EagL0bM9vnz5/WCA3T885QXjAUJDdRABuHAkiV9i2jQTuElr/7qK+2FoU8wcvjQYd1eYBiN4FwTTjT7Ar2b/gCDNyMVFEe0fRhaY0RMfZHGbKPuNCKGmnrH74EENCLKQKRa0r6sngkx8yK5NSDIBmU5ESgG/jHCmqYm+LZs3aIbpzkX3oMRy6bZ9ZMGizmN7GxfaMefKEobhQvH6RCZPXsTpoKhMIKOxyrWjhmdCUZZ36zfINt37NBhBKyEev65YdZT1CS/Mng37jR4pixrwkBlGWOJxmNizTgPMeukpEQ/N2u9cdxaV3zOD/Gi7sLrwOo7/KMDRKgJ3mLjRik+RLdVV26qP7vYOdt1t2CB/DXeVgOCusOLxbL6CgkVVCebJBis2Jc3x1n03K43mPMEp3QVKcCiFfw/P2yY9nBGjR4tGMhA72FsYDRNmDtbDfIwj+hWsq/5+gM770Jxhfw6j7yD1d1t2W7Py987H6TW+EGp3IobA4IygpV1/PgJeefdET9ZJ5+c7Jtk/1FNghWJL6Krag3rnFYhBLvsV3FhI3CXEeO3eh/mmNt3awzbngdGK5gIP3Pm7B2HMFqDOF3uiUnF8uXLS/+H++nVPZ07dtTPZcCFtwo6ehgC69LSlSpG7VQwskXjRHgOIUDz/5iah8FSZjPSw6S9kXPnzueJp2bKC/QeTJ8CnRMN3cWg5v0PPhQ852GVOrcWiNxU3p7prE6cvP3zCmfVxK9drLqLY/iMRRWREut8YiTyROgOAx4sbEE4tPWtRQBO8sbENgZ3WC32nArRYRUb9BEeXKYKd8GA9FXzlBg4Pdyvr7RQ4UEj0Hu0M3h+RhCCxhJ8q5hBknUftqtV80UjDh485D+EOScYKRhCL4p7kxnlq8EvEi75PMNRKR++nqon0q1PpMM7MQIvBY00kKCsQIIlsxhBT5w0Wa/uwMgDDW7BglTdyWHiuUiRwvr0pUuXSU81sXfm7BkdNoDiWQUTi1hhkVA+QYXDlulJzRQV5w9XMAorXqy4ClFs0cbAxHyt+dZVcVV0GB+PHKUbFVxkPOQ0a/ZsPcdTuXIla/KA25jMhlv99NCndDjulDKEGMWVuuXqmxPRgDFpidVoq1Yrt//SZf2wmDnu5B2xeyxoAHPkBc8H3DBvhNgyRpmY5MQyz3hlyOdYJkad5B+tNF7RXegFwompamFEnPJ6scQXk7hYrABJVqsMce8wx7dhwyZJSkzSneXC1DvnrZAW93zR4iXKc2nkm5tTYdj+/frhUNiCsBc61c1qxV89VScTDgsnY4R1UGc8JAmPeOq0GY6zO3XqpHz0v3+Vtm3aSPv2D8gZpeOoH1YFmuefdqiVi7Vq3atWVp1Qc0Nr/XnDQKPdjxv/mTYweDQAbQDndlB5QXC9WFGIVZ1JiYn+c7GBkBkGSJifgbeHlZK4H2i7uF9eFM8aETz8h18kdPrUutWAYGWWCW8B+l71dSeBnh1BGcEeNERD/IVybSdMnCifqX8jmBh7Rj03AoHS9+zeXZaoDu5vI0fq+GWD+vW1kpj0eO+kRu3o9KCQCNMMfPwx3UHimN0dx76cRFVHiz19586d9HwDyv+vN9/4yalQzl8NHy7jP/tMJk6e7D+O5YlYOGDEnu/t/b4teCATlEHFJCUE1zH4ySf1JLupmy+lyFNDBuu4+b59399azdZA/vzRX8zhgNds8umpngXAKAzLhDFSRYfXtUtnbUCQybPPDJVxn01Q9Zmk82zVsqVgpZHK2F9Gfmx4RXdx7dCxL6ZM1Ys0DAt0chgEmIl1pBmrVtiNnzBBJ8ECEKwUtOoClpcjtAOjjvuADtYs8XWK2+RnT4+5tVXq2YkZ6tmrDmrpsHkGxNQ31LvJ15qun/IQxo+foNsj9mM571dr1gTUDZNHASkglZWH9WC3rrL8yxVqiXmazhYLPMxCGqxQm690EroMlpgg3/yt7yFn9AUIe30xZYpeSYiTYRR+dmvBDD63VSHFPXv26iXTw57BYgXsvS3YN2HiJH87xdwp9gWa77DW/XYuebfl6V82xJfYTXxX3fgoyuDftnP83VkI5WCCuXz5cjrmb68WwgdwO80EnP04PiMNOsZIjLbs+SNvPKFsQhT24+YzPCuELOCNhEprzrG/IxyHsszIzH4c8Wd4XuhoTKhsxcpVKla9XP759d8FZWTPC5/x1D+YmQZjTYPrwX6752dNE8ltJ78K5zXdxcDl1KnTimFx/ZxFTjzAuJjyaAsVKpjTYb0P+o0J9JzuQ8CTHB5ACAn6GMm8UV/Mz9nn3hxWSesdrheG0ypO2jr0EufBo8hJcL2BjiE92hfuG1ZgRlqc6LDTMj3rieAC8MWIaYv2uv4m31AQ8HO5ufnyRXSY1aoF/joPKH8wA4L6IE00DIjJ24lRgFKaOYVQjAIdD9VhY1UXvmcMk5NV1UgsM/Oifm6mqRq1hWKUU5nBzolGI8upDrnZ5zXdhV5UqRJ8DiMYY3Pt0dJd5B+sQzXl5/Y93PoGYuKkrYfSy1DXC8Pn1vjlllM46e80r+HkFKVz8ZvoBQra/L0IlIU8kTclOgTQyF55+WV5WD04majivk2bNNZLTQeqifG7Rai7d8udvruv09PhLHNrIvkToybPF97sKvx5XEOD77khkJtQAHU3N2SZNq8I5EaHQ9XJ854ILgCdPTr9SHgkyIMGJJRa8HikCFB3I0WS+XiVgKfnRKzQ0BgrJZbWP2nr9tcOMQeCEEON+gnWrLlNAlElQN2NKl5mns8EYiKcZWeElS/45Tiny3+xjLfbwJRcTaLby+RnEjAEwgkFUHcNRb7nJ4FwdNhe75g0IuYi8Aty+AEg/H4Dvn7bfHsqvrsIXz2BJ4fx4Few50BMXnwnAacEItEAqbtOaTNdNAhEQodNvWLaiJiL4DsJ5CWBSDbAvKw3yyIBQyCSOhwTE+vmwvlOAiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRYBGJKZuFytLAiRAAt4iQCPirfvB2pAACZBATBGgEYmp28XKkgAJkIC3CNCIeOt+sDYkQAIkEFMEaERi6naxsiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRSBmfk8kpqiysncFAfMldnfFxfIiSSAAAXoiAcBwNwmQAAmQQGgC/Cr40IyYggRIgARIIAABeiIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgCNCKhGTEFCZAACZBAAAI0IgHAcDcJkAAJkEBoAjQioRkxBQmQAAmQQAACNCIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgC/w/zX0lg9vhbHgAAAABJRU5ErkJggg=="},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/id/assets/js/99590063.f8f0a2b8.js b/id/assets/js/99590063.f8f0a2b8.js deleted file mode 100644 index 8c623ebe1ed..00000000000 --- a/id/assets/js/99590063.f8f0a2b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[292],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8500:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/id/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/id/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/id/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/id/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/id/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/id/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/id/assets/js/runtime~main.7e720da7.js b/id/assets/js/runtime~main.3c68cfd7.js similarity index 98% rename from id/assets/js/runtime~main.7e720da7.js rename to id/assets/js/runtime~main.3c68cfd7.js index b9f8591048d..9cff1800009 100644 --- a/id/assets/js/runtime~main.7e720da7.js +++ b/id/assets/js/runtime~main.3c68cfd7.js @@ -1 +1 @@ -(()=>{"use strict";var e,f,a,b,d,c={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var a=t[e]={exports:{}};return c[e].call(a.exports,a,a.exports,r),a.exports}r.m=c,e=[],r.O=(f,a,b,d)=>{if(!a){var c=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,b,d]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var c={};f=f||[null,a({}),a([]),a(a)];for(var t=2&b&&e;"object"==typeof t&&!~f.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((f=>c[f]=()=>e[f]));return c.default=()=>e,r.d(d,c),d},r.d=(e,f)=>{for(var a in f)r.o(f,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,a)=>(r.f[a](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",121:"64fd69bd",292:"99590063",383:"7b27eb9e",436:"9f5cbb49",550:"ac6fdbb0",578:"dae3368d",638:"d7e122fc",667:"05e7e419",727:"ed9ed9cc",842:"a5d87665",868:"517f3261",1027:"b93c25cc",1162:"701a7c44",1210:"a9228e87",1249:"39e66118",1482:"7a24945f",1524:"2d1e0ca1",1527:"a2fd5790",1535:"6768be45",1550:"a366fa70",1586:"f722931e",1622:"6c707091",1717:"752f6cf5",1775:"d3b3b5b8",1855:"5920b46c",2400:"9f4729aa",2421:"5d261b3a",2500:"481fabcb",2608:"1174b2d0",2721:"0b2427c2",2749:"09521b16",3085:"1f391b9e",3095:"7889a806",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3298:"08df3b78",3362:"75e60e7d",3510:"753d1502",3600:"0bf987f8",3719:"3b5b0eb0",3923:"e2c3382c",4019:"bdbc9692",4102:"0a16929f",4154:"5fcf2fdf",4208:"852a303a",4244:"580613ad",4277:"d5770dc2",4292:"4fe4b767",4704:"e0ed9168",4745:"0a398f9c",4900:"3624b122",5110:"10779a4a",5148:"e23140d8",5573:"a6ba7fa5",5611:"aebb2fdd",5630:"97ba8b13",5733:"a3148fa6",5798:"bd115d5c",5841:"7e1c4ad6",5905:"67fd0207",6002:"654dab37",6005:"01c39339",6481:"7d6eb928",6707:"e44689f0",6746:"90b174ff",7025:"43cbe75f",7166:"2a3d70e9",7229:"e0366d15",7309:"5d0c8e17",7370:"c09f4ff7",7414:"393be207",7579:"6d76f582",7687:"2ab06f75",7703:"6946cb51",7733:"94dc1274",7840:"61031030",7918:"17896441",7978:"b5d5687a",8056:"169ac48c",8240:"1ccc5f48",8263:"b756a193",8393:"6354d7e3",8714:"ac8ddf9d",8732:"ab78ac32",8920:"d218dd66",8940:"ebd8d376",9076:"bdb57bb5",9113:"1d270a60",9133:"93ebb95e",9204:"1e1b8fd8",9261:"14eb5b9c",9514:"1be78505",9639:"baf6d53f",9817:"14eb3368",9925:"e630c9d5",9989:"a00f3598"}[e]||e)+"."+{53:"4098b9c8",121:"d62eb8ad",292:"f8f0a2b8",383:"1c3ecd90",436:"a62de35a",550:"8b7c4782",578:"5b560264",638:"ddc98d29",667:"eef7f9e3",727:"ecff8930",814:"dc8c3a26",842:"f09c6a7e",868:"dcf6a66a",1027:"38f18400",1162:"8137c6d2",1210:"7711a242",1249:"8c2488c3",1482:"69dd2fc9",1524:"bfabcc22",1527:"0c95a7ca",1535:"c70b5439",1550:"3f063176",1586:"3800f5f6",1622:"4dd338b8",1717:"59e61853",1775:"1f3d056a",1855:"231a39f5",2400:"70749ac5",2421:"5a083076",2500:"c903fb7c",2608:"7a4ccfc8",2721:"5aa6cf7e",2749:"53d2a8cb",3085:"3a447380",3095:"fd7157fb",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3298:"1c2ea7aa",3362:"99cbb340",3473:"fdffa07c",3510:"20897fb2",3600:"e819b033",3719:"6a8e3bdf",3923:"fbfbf40b",4019:"a29562bf",4102:"0ade37d9",4154:"6749e042",4208:"d68367ed",4244:"8418fc0d",4277:"5d0b67f1",4292:"c97427a5",4704:"cef4b002",4745:"7d4fa809",4900:"707c7928",4972:"4a54fd4a",5110:"d32de303",5148:"147a8901",5573:"e787d257",5611:"662baefc",5630:"0fd0d0db",5733:"5f5491df",5798:"3f6a3b33",5841:"b4bbaf9f",5905:"c04c1376",6002:"fd51514b",6005:"ca940fa6",6481:"36d08f01",6707:"20c33920",6746:"f184bcf1",7025:"dc979c02",7166:"5d2409a1",7229:"c285b89f",7309:"8a289c69",7370:"7d299aff",7414:"d6519706",7579:"b61589c6",7687:"37e3fa3e",7703:"ede838a5",7733:"942e4392",7840:"2e408167",7918:"e3da5265",7978:"c40c1935",8056:"81c1c2bc",8240:"f72f2966",8263:"49c5dd2e",8393:"f85621b4",8714:"f8ed1c73",8732:"2ff706af",8920:"083eb167",8940:"1079cff1",9076:"69f04219",9113:"c321b804",9133:"973bcc5b",9204:"7049aa97",9261:"2ff7aeb0",9514:"478c02c6",9639:"9e39adf5",9817:"b7ea7ab7",9925:"2b0db37f",9989:"cd85ecd6"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),b={},d="portal:",r.l=(e,f,a,c)=>{if(b[e])b[e].push(f);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(a))),f)return f(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/id/",r.gca=function(e){return e={17896441:"7918",61031030:"7840",99590063:"292","935f2afb":"53","64fd69bd":"121","7b27eb9e":"383","9f5cbb49":"436",ac6fdbb0:"550",dae3368d:"578",d7e122fc:"638","05e7e419":"667",ed9ed9cc:"727",a5d87665:"842","517f3261":"868",b93c25cc:"1027","701a7c44":"1162",a9228e87:"1210","39e66118":"1249","7a24945f":"1482","2d1e0ca1":"1524",a2fd5790:"1527","6768be45":"1535",a366fa70:"1550",f722931e:"1586","6c707091":"1622","752f6cf5":"1717",d3b3b5b8:"1775","5920b46c":"1855","9f4729aa":"2400","5d261b3a":"2421","481fabcb":"2500","1174b2d0":"2608","0b2427c2":"2721","09521b16":"2749","1f391b9e":"3085","7889a806":"3095",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","08df3b78":"3298","75e60e7d":"3362","753d1502":"3510","0bf987f8":"3600","3b5b0eb0":"3719",e2c3382c:"3923",bdbc9692:"4019","0a16929f":"4102","5fcf2fdf":"4154","852a303a":"4208","580613ad":"4244",d5770dc2:"4277","4fe4b767":"4292",e0ed9168:"4704","0a398f9c":"4745","3624b122":"4900","10779a4a":"5110",e23140d8:"5148",a6ba7fa5:"5573",aebb2fdd:"5611","97ba8b13":"5630",a3148fa6:"5733",bd115d5c:"5798","7e1c4ad6":"5841","67fd0207":"5905","654dab37":"6002","01c39339":"6005","7d6eb928":"6481",e44689f0:"6707","90b174ff":"6746","43cbe75f":"7025","2a3d70e9":"7166",e0366d15:"7229","5d0c8e17":"7309",c09f4ff7:"7370","393be207":"7414","6d76f582":"7579","2ab06f75":"7687","6946cb51":"7703","94dc1274":"7733",b5d5687a:"7978","169ac48c":"8056","1ccc5f48":"8240",b756a193:"8263","6354d7e3":"8393",ac8ddf9d:"8714",ab78ac32:"8732",d218dd66:"8920",ebd8d376:"8940",bdb57bb5:"9076","1d270a60":"9113","93ebb95e":"9133","1e1b8fd8":"9204","14eb5b9c":"9261","1be78505":"9514",baf6d53f:"9639","14eb3368":"9817",e630c9d5:"9925",a00f3598:"9989"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,a)=>{var b=r.o(e,f)?e[f]:void 0;if(0!==b)if(b)a.push(b[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var d=new Promise(((a,d)=>b=e[f]=[a,d]));a.push(b[2]=d);var c=r.p+r.u(f),t=new Error;r.l(c,(a=>{if(r.o(e,f)&&(0!==(b=e[f])&&(e[f]=void 0),b)){var d=a&&("load"===a.type?"missing":a.type),c=a&&a.target&&a.target.src;t.message="Loading chunk "+f+" failed.\n("+d+": "+c+")",t.name="ChunkLoadError",t.type=d,t.request=c,b[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,a)=>{var b,d,c=a[0],t=a[1],o=a[2],n=0;if(c.some((f=>0!==e[f]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(f&&f(a);n{"use strict";var e,f,a,b,d,c={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var a=t[e]={exports:{}};return c[e].call(a.exports,a,a.exports,r),a.exports}r.m=c,e=[],r.O=(f,a,b,d)=>{if(!a){var c=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,b,d]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var c={};f=f||[null,a({}),a([]),a(a)];for(var t=2&b&&e;"object"==typeof t&&!~f.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((f=>c[f]=()=>e[f]));return c.default=()=>e,r.d(d,c),d},r.d=(e,f)=>{for(var a in f)r.o(f,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,a)=>(r.f[a](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",121:"64fd69bd",292:"99590063",383:"7b27eb9e",436:"9f5cbb49",550:"ac6fdbb0",578:"dae3368d",638:"d7e122fc",667:"05e7e419",727:"ed9ed9cc",842:"a5d87665",868:"517f3261",1027:"b93c25cc",1162:"701a7c44",1210:"a9228e87",1249:"39e66118",1482:"7a24945f",1524:"2d1e0ca1",1527:"a2fd5790",1535:"6768be45",1550:"a366fa70",1586:"f722931e",1622:"6c707091",1717:"752f6cf5",1775:"d3b3b5b8",1855:"5920b46c",2400:"9f4729aa",2421:"5d261b3a",2500:"481fabcb",2608:"1174b2d0",2721:"0b2427c2",2749:"09521b16",3085:"1f391b9e",3095:"7889a806",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3298:"08df3b78",3362:"75e60e7d",3510:"753d1502",3600:"0bf987f8",3719:"3b5b0eb0",3923:"e2c3382c",4019:"bdbc9692",4102:"0a16929f",4154:"5fcf2fdf",4208:"852a303a",4244:"580613ad",4277:"d5770dc2",4292:"4fe4b767",4704:"e0ed9168",4745:"0a398f9c",4900:"3624b122",5110:"10779a4a",5148:"e23140d8",5573:"a6ba7fa5",5611:"aebb2fdd",5630:"97ba8b13",5733:"a3148fa6",5798:"bd115d5c",5841:"7e1c4ad6",5905:"67fd0207",6002:"654dab37",6005:"01c39339",6481:"7d6eb928",6707:"e44689f0",6746:"90b174ff",7025:"43cbe75f",7166:"2a3d70e9",7229:"e0366d15",7309:"5d0c8e17",7370:"c09f4ff7",7414:"393be207",7579:"6d76f582",7687:"2ab06f75",7703:"6946cb51",7733:"94dc1274",7840:"61031030",7918:"17896441",7978:"b5d5687a",8056:"169ac48c",8240:"1ccc5f48",8263:"b756a193",8393:"6354d7e3",8714:"ac8ddf9d",8732:"ab78ac32",8920:"d218dd66",8940:"ebd8d376",9076:"bdb57bb5",9113:"1d270a60",9133:"93ebb95e",9204:"1e1b8fd8",9261:"14eb5b9c",9514:"1be78505",9639:"baf6d53f",9817:"14eb3368",9925:"e630c9d5",9989:"a00f3598"}[e]||e)+"."+{53:"4098b9c8",121:"d62eb8ad",292:"7772fff9",383:"1c3ecd90",436:"a62de35a",550:"8b7c4782",578:"5b560264",638:"ddc98d29",667:"eef7f9e3",727:"ecff8930",814:"dc8c3a26",842:"f09c6a7e",868:"dcf6a66a",1027:"38f18400",1162:"8137c6d2",1210:"7711a242",1249:"8c2488c3",1482:"69dd2fc9",1524:"bfabcc22",1527:"0c95a7ca",1535:"c70b5439",1550:"3f063176",1586:"3800f5f6",1622:"4dd338b8",1717:"59e61853",1775:"1f3d056a",1855:"231a39f5",2400:"70749ac5",2421:"5a083076",2500:"c903fb7c",2608:"7a4ccfc8",2721:"5aa6cf7e",2749:"53d2a8cb",3085:"3a447380",3095:"fd7157fb",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3298:"1c2ea7aa",3362:"99cbb340",3473:"fdffa07c",3510:"20897fb2",3600:"e819b033",3719:"6a8e3bdf",3923:"fbfbf40b",4019:"a29562bf",4102:"0ade37d9",4154:"6749e042",4208:"d68367ed",4244:"8418fc0d",4277:"5d0b67f1",4292:"c97427a5",4704:"cef4b002",4745:"7d4fa809",4900:"707c7928",4972:"4a54fd4a",5110:"d32de303",5148:"147a8901",5573:"e787d257",5611:"662baefc",5630:"0fd0d0db",5733:"5f5491df",5798:"3f6a3b33",5841:"b4bbaf9f",5905:"c04c1376",6002:"fd51514b",6005:"ca940fa6",6481:"36d08f01",6707:"20c33920",6746:"f184bcf1",7025:"dc979c02",7166:"5d2409a1",7229:"c285b89f",7309:"8a289c69",7370:"7d299aff",7414:"d6519706",7579:"b61589c6",7687:"37e3fa3e",7703:"ede838a5",7733:"942e4392",7840:"bf60a6bc",7918:"e3da5265",7978:"c40c1935",8056:"81c1c2bc",8240:"f72f2966",8263:"49c5dd2e",8393:"f85621b4",8714:"f8ed1c73",8732:"2ff706af",8920:"083eb167",8940:"1079cff1",9076:"69f04219",9113:"c321b804",9133:"973bcc5b",9204:"7049aa97",9261:"2ff7aeb0",9514:"478c02c6",9639:"9e39adf5",9817:"b7ea7ab7",9925:"2b0db37f",9989:"cd85ecd6"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),b={},d="portal:",r.l=(e,f,a,c)=>{if(b[e])b[e].push(f);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(a))),f)return f(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/id/",r.gca=function(e){return e={17896441:"7918",61031030:"7840",99590063:"292","935f2afb":"53","64fd69bd":"121","7b27eb9e":"383","9f5cbb49":"436",ac6fdbb0:"550",dae3368d:"578",d7e122fc:"638","05e7e419":"667",ed9ed9cc:"727",a5d87665:"842","517f3261":"868",b93c25cc:"1027","701a7c44":"1162",a9228e87:"1210","39e66118":"1249","7a24945f":"1482","2d1e0ca1":"1524",a2fd5790:"1527","6768be45":"1535",a366fa70:"1550",f722931e:"1586","6c707091":"1622","752f6cf5":"1717",d3b3b5b8:"1775","5920b46c":"1855","9f4729aa":"2400","5d261b3a":"2421","481fabcb":"2500","1174b2d0":"2608","0b2427c2":"2721","09521b16":"2749","1f391b9e":"3085","7889a806":"3095",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280","08df3b78":"3298","75e60e7d":"3362","753d1502":"3510","0bf987f8":"3600","3b5b0eb0":"3719",e2c3382c:"3923",bdbc9692:"4019","0a16929f":"4102","5fcf2fdf":"4154","852a303a":"4208","580613ad":"4244",d5770dc2:"4277","4fe4b767":"4292",e0ed9168:"4704","0a398f9c":"4745","3624b122":"4900","10779a4a":"5110",e23140d8:"5148",a6ba7fa5:"5573",aebb2fdd:"5611","97ba8b13":"5630",a3148fa6:"5733",bd115d5c:"5798","7e1c4ad6":"5841","67fd0207":"5905","654dab37":"6002","01c39339":"6005","7d6eb928":"6481",e44689f0:"6707","90b174ff":"6746","43cbe75f":"7025","2a3d70e9":"7166",e0366d15:"7229","5d0c8e17":"7309",c09f4ff7:"7370","393be207":"7414","6d76f582":"7579","2ab06f75":"7687","6946cb51":"7703","94dc1274":"7733",b5d5687a:"7978","169ac48c":"8056","1ccc5f48":"8240",b756a193:"8263","6354d7e3":"8393",ac8ddf9d:"8714",ab78ac32:"8732",d218dd66:"8920",ebd8d376:"8940",bdb57bb5:"9076","1d270a60":"9113","93ebb95e":"9133","1e1b8fd8":"9204","14eb5b9c":"9261","1be78505":"9514",baf6d53f:"9639","14eb3368":"9817",e630c9d5:"9925",a00f3598:"9989"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,a)=>{var b=r.o(e,f)?e[f]:void 0;if(0!==b)if(b)a.push(b[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var d=new Promise(((a,d)=>b=e[f]=[a,d]));a.push(b[2]=d);var c=r.p+r.u(f),t=new Error;r.l(c,(a=>{if(r.o(e,f)&&(0!==(b=e[f])&&(e[f]=void 0),b)){var d=a&&("load"===a.type?"missing":a.type),c=a&&a.target&&a.target.src;t.message="Loading chunk "+f+" failed.\n("+d+": "+c+")",t.name="ChunkLoadError",t.type=d,t.request=c,b[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,a)=>{var b,d,c=a[0],t=a[1],o=a[2],n=0;if(c.some((f=>0!==e[f]))){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(f&&f(a);n - + - + \ No newline at end of file diff --git a/id/docs/category/advanced-cli/index.html b/id/docs/category/advanced-cli/index.html index 45dc5d6444a..2176ce1310d 100644 --- a/id/docs/category/advanced-cli/index.html +++ b/id/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/category/develop-on-nova-evm-/index.html b/id/docs/category/develop-on-nova-evm-/index.html index c33f25a9ea7..406fe243412 100644 --- a/id/docs/category/develop-on-nova-evm-/index.html +++ b/id/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/id/docs/category/develop/index.html b/id/docs/category/develop/index.html index c86a2f8e12e..e0c580193f4 100644 --- a/id/docs/category/develop/index.html +++ b/id/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/category/farming/index.html b/id/docs/category/farming/index.html index d0e62db7774..de7e061f8a7 100644 --- a/id/docs/category/farming/index.html +++ b/id/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/category/learn/index.html b/id/docs/category/learn/index.html index efbe7c2b4db..3cacbca37d5 100644 --- a/id/docs/category/learn/index.html +++ b/id/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/category/operators-and-nominators/index.html b/id/docs/category/operators-and-nominators/index.html index fb499c5ccf1..4beca68e02a 100644 --- a/id/docs/category/operators-and-nominators/index.html +++ b/id/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/category/participate/index.html b/id/docs/category/participate/index.html index d9fa3c6410d..2a7a59047fa 100644 --- a/id/docs/category/participate/index.html +++ b/id/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/category/pulsar-recommended/index.html b/id/docs/category/pulsar-recommended/index.html index 0b31c0d64b1..05da3348b4f 100644 --- a/id/docs/category/pulsar-recommended/index.html +++ b/id/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/category/wallets/index.html b/id/docs/category/wallets/index.html index f7faa78b91e..2a28eb662d1 100644 --- a/id/docs/category/wallets/index.html +++ b/id/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/develop/nova/block_explorer/index.html b/id/docs/develop/nova/block_explorer/index.html index c0821e38f30..f4ff96ed560 100644 --- a/id/docs/develop/nova/block_explorer/index.html +++ b/id/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/develop/nova/faucet/index.html b/id/docs/develop/nova/faucet/index.html index f76decb7748..fdccb5b65db 100644 --- a/id/docs/develop/nova/faucet/index.html +++ b/id/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/id/docs/develop/nova/foundry_guide/index.html b/id/docs/develop/nova/foundry_guide/index.html index 44b50856872..3b037bfb936 100644 --- a/id/docs/develop/nova/foundry_guide/index.html +++ b/id/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/id/docs/develop/nova/general-information/index.html b/id/docs/develop/nova/general-information/index.html index 769041c2ef4..9ed235b1fc3 100644 --- a/id/docs/develop/nova/general-information/index.html +++ b/id/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/id/docs/develop/nova/hardhat_guide/index.html b/id/docs/develop/nova/hardhat_guide/index.html index a225a4f26cd..83ccc75a653 100644 --- a/id/docs/develop/nova/hardhat_guide/index.html +++ b/id/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/id/docs/develop/nova/intro/index.html b/id/docs/develop/nova/intro/index.html index 550ec209d1f..982a92d07b0 100644 --- a/id/docs/develop/nova/intro/index.html +++ b/id/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/id/docs/develop/nova/local_development/index.html b/id/docs/develop/nova/local_development/index.html index 43f57b22da5..b3aabc6438b 100644 --- a/id/docs/develop/nova/local_development/index.html +++ b/id/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/id/docs/develop/nova/quick_start/index.html b/id/docs/develop/nova/quick_start/index.html index 82b9f8821eb..c252fea6224 100644 --- a/id/docs/develop/nova/quick_start/index.html +++ b/id/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/id/docs/develop/nova/remix_guide/index.html b/id/docs/develop/nova/remix_guide/index.html index cb37f3ba606..ca3e9f332c7 100644 --- a/id/docs/develop/nova/remix_guide/index.html +++ b/id/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/id/docs/develop/nova/setting-up-metamask/index.html b/id/docs/develop/nova/setting-up-metamask/index.html index f8bc2cd790a..76342629f01 100644 --- a/id/docs/develop/nova/setting-up-metamask/index.html +++ b/id/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/id/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 3cc694f684f..60198e64277 100644 --- a/id/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/id/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/id/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index f9d3596f782..a5411059026 100644 --- a/id/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/id/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/id/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 598061a333b..f412d395b48 100644 --- a/id/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/id/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/id/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index fa09c36e7a7..5ae03a791de 100644 --- a/id/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/id/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/id/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index c02772e7f17..b94414af68e 100644 --- a/id/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/id/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/common_problems/index.html b/id/docs/farming-&-staking/farming/common_problems/index.html index d3a0dab2479..7ece699196c 100644 --- a/id/docs/farming-&-staking/farming/common_problems/index.html +++ b/id/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/id/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 3976641b13b..3dacfcbb350 100644 --- a/id/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/id/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/id/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index f6852d8770d..f6373dfa24a 100644 --- a/id/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/id/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/id/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 42f02ad3d92..3859a00e8c6 100644 --- a/id/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/id/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/id/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 43e39c2225f..390d0965358 100644 --- a/id/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/id/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/index.html b/id/docs/farming-&-staking/index.html index c92935cc098..247ecdb6347 100644 --- a/id/docs/farming-&-staking/index.html +++ b/id/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/staking/index.html b/id/docs/farming-&-staking/staking/index.html index e31a4af2b57..6165db8259f 100644 --- a/id/docs/farming-&-staking/staking/index.html +++ b/id/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/staking/intro/index.html b/id/docs/farming-&-staking/staking/intro/index.html index c74cbc50284..c00bd5650f2 100644 --- a/id/docs/farming-&-staking/staking/intro/index.html +++ b/id/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/staking/operators/index.html b/id/docs/farming-&-staking/staking/operators/index.html index d2e22574d83..5e64347e5f0 100644 --- a/id/docs/farming-&-staking/staking/operators/index.html +++ b/id/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/timekeeping/index.html b/id/docs/farming-&-staking/timekeeping/index.html index 88d2d22c399..99c51159ab5 100644 --- a/id/docs/farming-&-staking/timekeeping/index.html +++ b/id/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/wallets/polkadot/index.html b/id/docs/farming-&-staking/wallets/polkadot/index.html index c319fbb0c46..68c15dc76c5 100644 --- a/id/docs/farming-&-staking/wallets/polkadot/index.html +++ b/id/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/id/docs/farming-&-staking/wallets/subwallet/index.html b/id/docs/farming-&-staking/wallets/subwallet/index.html index 765c3ccfa85..03fa363a5da 100644 --- a/id/docs/farming-&-staking/wallets/subwallet/index.html +++ b/id/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/id/docs/learn/intro/index.html b/id/docs/learn/intro/index.html index 8ffe0aaec79..28bd4aa8a9e 100644 --- a/id/docs/learn/intro/index.html +++ b/id/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/id/docs/learn/security/index.html b/id/docs/learn/security/index.html index d52774e8287..1a156d2c709 100644 --- a/id/docs/learn/security/index.html +++ b/id/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/id/docs/learn/subnomicon/index.html b/id/docs/learn/subnomicon/index.html index eb972bb2e6e..db3ad1ae1ae 100644 --- a/id/docs/learn/subnomicon/index.html +++ b/id/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/id/docs/participate/CODE_OF_CONDUCT/index.html b/id/docs/participate/CODE_OF_CONDUCT/index.html index c0fff990b0c..4c9bc1dbc7a 100644 --- a/id/docs/participate/CODE_OF_CONDUCT/index.html +++ b/id/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/id/docs/participate/contribute/index.html b/id/docs/participate/contribute/index.html index 9502cf398bd..0ad087bc73c 100644 --- a/id/docs/participate/contribute/index.html +++ b/id/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/id/docs/participate/index.html b/id/docs/participate/index.html index dc59fc2cb86..d91c88302e8 100644 --- a/id/docs/participate/index.html +++ b/id/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/id/docs/participate/translate/index.html b/id/docs/participate/translate/index.html index 711a9eaaecd..43418d0745f 100644 --- a/id/docs/participate/translate/index.html +++ b/id/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/category/additional-guides/index.html b/id/docs/pre-release/category/additional-guides/index.html index b3eb1f5b130..25883b1f111 100644 --- a/id/docs/pre-release/category/additional-guides/index.html +++ b/id/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/advanced-cli/index.html b/id/docs/pre-release/category/advanced-cli/index.html index d51aa3bf3ab..decf5f48212 100644 --- a/id/docs/pre-release/category/advanced-cli/index.html +++ b/id/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/develop-on-nova-evm-/index.html b/id/docs/pre-release/category/develop-on-nova-evm-/index.html index 942a6d82720..1189445c177 100644 --- a/id/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/id/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/id/docs/pre-release/category/develop/index.html b/id/docs/pre-release/category/develop/index.html index ef96ea34ffe..5f94666f68b 100644 --- a/id/docs/pre-release/category/develop/index.html +++ b/id/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/farming/index.html b/id/docs/pre-release/category/farming/index.html index 44aabbabf7c..29747b3a0ac 100644 --- a/id/docs/pre-release/category/farming/index.html +++ b/id/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/learn/index.html b/id/docs/pre-release/category/learn/index.html index ee2d4499f81..eafef68535c 100644 --- a/id/docs/pre-release/category/learn/index.html +++ b/id/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/operators-and-nominators/index.html b/id/docs/pre-release/category/operators-and-nominators/index.html index f4d7695f86c..157f49d27c8 100644 --- a/id/docs/pre-release/category/operators-and-nominators/index.html +++ b/id/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/participate/index.html b/id/docs/pre-release/category/participate/index.html index 5bcd9b6bd7a..8fd0557e508 100644 --- a/id/docs/pre-release/category/participate/index.html +++ b/id/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/pulsar-recommended/index.html b/id/docs/pre-release/category/pulsar-recommended/index.html index 3b242de0fa0..784ca09a989 100644 --- a/id/docs/pre-release/category/pulsar-recommended/index.html +++ b/id/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/category/wallets/index.html b/id/docs/pre-release/category/wallets/index.html index 725ba2e0e1d..49ccf5a0edd 100644 --- a/id/docs/pre-release/category/wallets/index.html +++ b/id/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/block_explorer/index.html b/id/docs/pre-release/develop/nova/block_explorer/index.html index 379e1430f0f..d8314d4f7c3 100644 --- a/id/docs/pre-release/develop/nova/block_explorer/index.html +++ b/id/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/faucet/index.html b/id/docs/pre-release/develop/nova/faucet/index.html index 17c1c1f852c..11a82a86cf0 100644 --- a/id/docs/pre-release/develop/nova/faucet/index.html +++ b/id/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/foundry_guide/index.html b/id/docs/pre-release/develop/nova/foundry_guide/index.html index 4898eb4cf00..533ff37614c 100644 --- a/id/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/id/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/general-information/index.html b/id/docs/pre-release/develop/nova/general-information/index.html index 3260df5c06c..78c13a43b7c 100644 --- a/id/docs/pre-release/develop/nova/general-information/index.html +++ b/id/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/hardhat_guide/index.html b/id/docs/pre-release/develop/nova/hardhat_guide/index.html index fe88a0e7070..1effd5cf010 100644 --- a/id/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/id/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/intro/index.html b/id/docs/pre-release/develop/nova/intro/index.html index 0dab6122733..b601a756b7d 100644 --- a/id/docs/pre-release/develop/nova/intro/index.html +++ b/id/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/local_development/index.html b/id/docs/pre-release/develop/nova/local_development/index.html index b585b786119..8565f9732f3 100644 --- a/id/docs/pre-release/develop/nova/local_development/index.html +++ b/id/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/quick_start/index.html b/id/docs/pre-release/develop/nova/quick_start/index.html index c0848c56019..1e261461ac3 100644 --- a/id/docs/pre-release/develop/nova/quick_start/index.html +++ b/id/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/remix_guide/index.html b/id/docs/pre-release/develop/nova/remix_guide/index.html index 612ac8242f3..30cd8000184 100644 --- a/id/docs/pre-release/develop/nova/remix_guide/index.html +++ b/id/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/id/docs/pre-release/develop/nova/setting-up-metamask/index.html b/id/docs/pre-release/develop/nova/setting-up-metamask/index.html index fb3182d275a..03dbd3c253f 100644 --- a/id/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/id/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/id/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 4ecf832439a..d68a81486cc 100644 --- a/id/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 31983e5170b..7359082323c 100644 --- a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 473a6bf70b5..c66a10e9f2a 100644 --- a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index e96d6d641ca..1c5b8a9c252 100644 --- a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 52ff81acc0f..272a17fe143 100644 --- a/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/id/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 6a404811755..6a5d40aaee3 100644 --- a/id/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 0d49795db1c..93f089f837a 100644 --- a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 053964c5ca4..ab2a1013fe0 100644 --- a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 8390c273d26..f69eb38d53a 100644 --- a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 69e07d32dc2..3641af69aa9 100644 --- a/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/id/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/index.html b/id/docs/pre-release/farming-&-staking/index.html index 791b8d463f1..fd05edd3c3a 100644 --- a/id/docs/pre-release/farming-&-staking/index.html +++ b/id/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/staking/index.html b/id/docs/pre-release/farming-&-staking/staking/index.html index 3a34e1a80bd..ceee05e881e 100644 --- a/id/docs/pre-release/farming-&-staking/staking/index.html +++ b/id/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/staking/intro/index.html b/id/docs/pre-release/farming-&-staking/staking/intro/index.html index b1e4f195bf1..4166a51a92f 100644 --- a/id/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/id/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/staking/operators/index.html b/id/docs/pre-release/farming-&-staking/staking/operators/index.html index 07f73e1e52b..fea336ce28b 100644 --- a/id/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/id/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/timekeeping/index.html b/id/docs/pre-release/farming-&-staking/timekeeping/index.html index 3a6c12bfae7..2b2193f4799 100644 --- a/id/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/id/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/id/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 3254f10d295..4290145efbe 100644 --- a/id/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/id/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/id/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/id/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index fee78b5c419..74fcc5efe66 100644 --- a/id/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/id/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/id/docs/pre-release/learn/intro/index.html b/id/docs/pre-release/learn/intro/index.html index dee85a53e4b..be6fd06f73e 100644 --- a/id/docs/pre-release/learn/intro/index.html +++ b/id/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/id/docs/pre-release/learn/security/index.html b/id/docs/pre-release/learn/security/index.html index 9c33fe1a41d..aa414cbe759 100644 --- a/id/docs/pre-release/learn/security/index.html +++ b/id/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/learn/subnomicon/index.html b/id/docs/pre-release/learn/subnomicon/index.html index 3cdc1db2161..84c0fc4ba72 100644 --- a/id/docs/pre-release/learn/subnomicon/index.html +++ b/id/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/id/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/id/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 24deb95d46d..2d4b9aab4d1 100644 --- a/id/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/id/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/participate/contribute/index.html b/id/docs/pre-release/participate/contribute/index.html index b466828e9f5..3d03dfcbb7d 100644 --- a/id/docs/pre-release/participate/contribute/index.html +++ b/id/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/id/docs/pre-release/participate/index.html b/id/docs/pre-release/participate/index.html index da313275f49..a7d2b277a9e 100644 --- a/id/docs/pre-release/participate/index.html +++ b/id/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/id/docs/pre-release/participate/translate/index.html b/id/docs/pre-release/participate/translate/index.html index a497ebaefc2..e94811da4de 100644 --- a/id/docs/pre-release/participate/translate/index.html +++ b/id/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/id/index.html b/id/index.html index e9593004215..9e4168d69fd 100644 --- a/id/index.html +++ b/id/index.html @@ -7,13 +7,13 @@ - +

    Berladang dari Mana Saja

    Dapatkan hadiah dengan menjalankan simpul petani dengan menjanjikan disk sisa. Tidak diperlukan pengaturan mahal atau modal awal.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/id/markdown-page/index.html b/id/markdown-page/index.html index 3437657c6d6..189b63e09c2 100644 --- a/id/markdown-page/index.html +++ b/id/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/index.html b/index.html index ea8d1c1c0a0..350081d25e3 100644 --- a/index.html +++ b/index.html @@ -7,13 +7,13 @@ - +

    Farm from Anywhere

    Earn rewards by running a farmer node by pledging spare disk. No expensive setup or upfront capital is required.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/it/404.html b/it/404.html index 74a574f08bf..18090a83b73 100644 --- a/it/404.html +++ b/it/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/assets/js/5f6488da.cd409d56.js b/it/assets/js/5f6488da.cd409d56.js deleted file mode 100644 index 8c0ba231c69..00000000000 --- a/it/assets/js/5f6488da.cd409d56.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8024],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7849:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/it/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/it/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/it/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/it/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/it/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/it/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/it/assets/js/5f6488da.d4057af8.js b/it/assets/js/5f6488da.d4057af8.js new file mode 100644 index 00000000000..3011542753e --- /dev/null +++ b/it/assets/js/5f6488da.d4057af8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8024],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7849:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/it/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/it/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/it/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/it/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/it/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/it/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/it/assets/js/6ea21d64.227484ea.js b/it/assets/js/6ea21d64.227484ea.js new file mode 100644 index 00000000000..09988b7d159 --- /dev/null +++ b/it/assets/js/6ea21d64.227484ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[7364],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7911:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/it/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/it/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/it/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/it/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/it/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/it/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/it/assets/js/6ea21d64.c2424aef.js b/it/assets/js/6ea21d64.c2424aef.js deleted file mode 100644 index a36338ec663..00000000000 --- a/it/assets/js/6ea21d64.c2424aef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[7364],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7911:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/it/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/it/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/it/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/it/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/it/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/it/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/it/assets/js/runtime~main.fea2669b.js b/it/assets/js/runtime~main.e8c386fd.js similarity index 77% rename from it/assets/js/runtime~main.fea2669b.js rename to it/assets/js/runtime~main.e8c386fd.js index 9a87e0d5b51..c629542bccd 100644 --- a/it/assets/js/runtime~main.fea2669b.js +++ b/it/assets/js/runtime~main.e8c386fd.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",84:"dcec2ea6",177:"563e9412",247:"945bebc5",338:"7e6d0c69",348:"9e4b59f4",352:"c93659fc",427:"67a31cc6",448:"3b8b137f",590:"1e3a5ca5",594:"73282ac9",662:"4a962f1b",667:"d555297e",780:"4ad31143",1071:"cb65eb1c",1137:"c1ebe8a5",1352:"29657cdf",1449:"ef675072",1464:"811999e0",1536:"4eefbb7d",1652:"9b5da377",1672:"a311895f",1772:"73e41789",1948:"197138d8",2079:"e118f683",2164:"adb6ef7e",2245:"dcaa1a88",2471:"526b0ec1",2577:"35dd1768",2781:"5ceaf7f4",2814:"672b0908",3007:"c704d4ed",3085:"1f391b9e",3198:"2122f7d4",3235:"da6f36cd",3237:"1df93b7f",3244:"56759256",3280:"ef42b41f",3355:"dd11ccf7",3699:"81db4688",3947:"b3df89ba",4131:"a698c97b",4467:"eca89e88",4493:"9fbd2421",4512:"1b6a3095",4633:"8a4ba3c9",4635:"8ecc21da",5461:"06fa3bb5",5528:"dec8d80c",5593:"1f04ec67",5599:"66b11570",5883:"058d0cd9",5901:"d8a82e4a",5971:"0a9fd760",5976:"af382ca0",6128:"5f0a5a05",6364:"c83eaecb",6377:"49339ffa",6391:"f1a0996f",6393:"6fcd18b4",6404:"130227bc",6708:"59826336",6950:"dabee6e8",7016:"9debe291",7168:"97eaebbb",7201:"618ed420",7220:"d4f07ae4",7364:"6ea21d64",7370:"c09f4ff7",7399:"119c1f90",7414:"393be207",7494:"8608984a",7747:"da68204b",7808:"515bfcee",7918:"17896441",8024:"5f6488da",8056:"1a925473",8370:"dfe38887",8415:"76b95807",8487:"ed0ffeb6",8584:"d55662b9",9022:"aaf21647",9118:"11823b0c",9287:"9ef353dd",9312:"63ac2ab6",9318:"5024eb1b",9514:"1be78505",9539:"1c94803f",9552:"fc9b1527",9569:"439934bc",9570:"0b565ebd",9575:"0fa5668b",9683:"b132f812",9758:"4eb2dbb6",9785:"416a1f7a",9817:"14eb3368",9932:"e9ae2010",9954:"f2cd1aae"}[e]||e)+"."+{53:"b1238dd8",84:"d14ec78d",177:"25d6f315",247:"36a18531",338:"f1757020",348:"9a4f30fb",352:"38bfce16",427:"b4f6d3ff",448:"61a25eb6",590:"95b0b8ca",594:"391ac5a2",662:"bb472855",667:"f391531a",780:"ac36c8e1",814:"dc8c3a26",1071:"64cd1073",1137:"6254ec5e",1352:"f7b00ee1",1449:"9df954bd",1464:"df33637e",1536:"1274ce14",1652:"ef9b1036",1672:"d1f88e42",1772:"a1a812ec",1948:"17480e7a",2079:"76d0fbec",2164:"b0009b16",2245:"4e15205a",2471:"f84cc69b",2577:"1f0fa502",2781:"70cfd379",2814:"5948bf65",3007:"095c19d2",3085:"3a447380",3198:"c1af2b43",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3244:"b01f590f",3280:"a28d7ef7",3355:"37f00420",3473:"fdffa07c",3699:"e8c71bf1",3947:"92d1ac69",4131:"fc6758c1",4467:"a99cd6a7",4493:"f2d505e9",4512:"0a79f41a",4633:"00053c9b",4635:"fa5ec4ed",4972:"4a54fd4a",5461:"c5f005e1",5528:"dfc5ae3c",5593:"67948b8f",5599:"d6b92f8c",5883:"8e97989d",5901:"d702e07d",5971:"53c215ee",5976:"eccca559",6128:"2c38fb7e",6364:"ba9c260f",6377:"4d58ed9c",6391:"c755c501",6393:"c7a2e68f",6404:"b385b4ba",6708:"b422fe78",6950:"9e49b0b8",7016:"97faded3",7168:"f2feff75",7201:"360f39ab",7220:"4e2ec359",7364:"c2424aef",7370:"2180c8ef",7399:"d63d25c1",7414:"f9f4e52e",7494:"698caba6",7747:"90fc3071",7808:"d4e8e285",7918:"e3da5265",8024:"cd409d56",8056:"bf28eab5",8370:"a1fc4a79",8415:"db722672",8487:"5a9bdc4b",8584:"39303453",9022:"6c0788ae",9118:"65c7b1d4",9287:"57eaaaa3",9312:"31428b31",9318:"9cf93a5f",9514:"478c02c6",9539:"04195e12",9552:"c257514f",9569:"bf26bf88",9570:"a68b2cb9",9575:"4095af78",9683:"1acbaae6",9758:"d3b87f29",9785:"58d598d9",9817:"b7ea7ab7",9932:"a961143b",9954:"29c295e3"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="portal:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/it/",r.gca=function(e){return e={17896441:"7918",56759256:"3244",59826336:"6708","935f2afb":"53",dcec2ea6:"84","563e9412":"177","945bebc5":"247","7e6d0c69":"338","9e4b59f4":"348",c93659fc:"352","67a31cc6":"427","3b8b137f":"448","1e3a5ca5":"590","73282ac9":"594","4a962f1b":"662",d555297e:"667","4ad31143":"780",cb65eb1c:"1071",c1ebe8a5:"1137","29657cdf":"1352",ef675072:"1449","811999e0":"1464","4eefbb7d":"1536","9b5da377":"1652",a311895f:"1672","73e41789":"1772","197138d8":"1948",e118f683:"2079",adb6ef7e:"2164",dcaa1a88:"2245","526b0ec1":"2471","35dd1768":"2577","5ceaf7f4":"2781","672b0908":"2814",c704d4ed:"3007","1f391b9e":"3085","2122f7d4":"3198",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",dd11ccf7:"3355","81db4688":"3699",b3df89ba:"3947",a698c97b:"4131",eca89e88:"4467","9fbd2421":"4493","1b6a3095":"4512","8a4ba3c9":"4633","8ecc21da":"4635","06fa3bb5":"5461",dec8d80c:"5528","1f04ec67":"5593","66b11570":"5599","058d0cd9":"5883",d8a82e4a:"5901","0a9fd760":"5971",af382ca0:"5976","5f0a5a05":"6128",c83eaecb:"6364","49339ffa":"6377",f1a0996f:"6391","6fcd18b4":"6393","130227bc":"6404",dabee6e8:"6950","9debe291":"7016","97eaebbb":"7168","618ed420":"7201",d4f07ae4:"7220","6ea21d64":"7364",c09f4ff7:"7370","119c1f90":"7399","393be207":"7414","8608984a":"7494",da68204b:"7747","515bfcee":"7808","5f6488da":"8024","1a925473":"8056",dfe38887:"8370","76b95807":"8415",ed0ffeb6:"8487",d55662b9:"8584",aaf21647:"9022","11823b0c":"9118","9ef353dd":"9287","63ac2ab6":"9312","5024eb1b":"9318","1be78505":"9514","1c94803f":"9539",fc9b1527:"9552","439934bc":"9569","0b565ebd":"9570","0fa5668b":"9575",b132f812:"9683","4eb2dbb6":"9758","416a1f7a":"9785","14eb3368":"9817",e9ae2010:"9932",f2cd1aae:"9954"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,d,b,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return c[e].call(f.exports,f,f.exports,r),f.exports}r.m=c,e=[],r.O=(a,f,d,b)=>{if(!f){var c=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,d,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,r.d(b,c),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",84:"dcec2ea6",177:"563e9412",247:"945bebc5",338:"7e6d0c69",348:"9e4b59f4",352:"c93659fc",427:"67a31cc6",448:"3b8b137f",590:"1e3a5ca5",594:"73282ac9",662:"4a962f1b",667:"d555297e",780:"4ad31143",1071:"cb65eb1c",1137:"c1ebe8a5",1352:"29657cdf",1449:"ef675072",1464:"811999e0",1536:"4eefbb7d",1652:"9b5da377",1672:"a311895f",1772:"73e41789",1948:"197138d8",2079:"e118f683",2164:"adb6ef7e",2245:"dcaa1a88",2471:"526b0ec1",2577:"35dd1768",2781:"5ceaf7f4",2814:"672b0908",3007:"c704d4ed",3085:"1f391b9e",3198:"2122f7d4",3235:"da6f36cd",3237:"1df93b7f",3244:"56759256",3280:"ef42b41f",3355:"dd11ccf7",3699:"81db4688",3947:"b3df89ba",4131:"a698c97b",4467:"eca89e88",4493:"9fbd2421",4512:"1b6a3095",4633:"8a4ba3c9",4635:"8ecc21da",5461:"06fa3bb5",5528:"dec8d80c",5593:"1f04ec67",5599:"66b11570",5883:"058d0cd9",5901:"d8a82e4a",5971:"0a9fd760",5976:"af382ca0",6128:"5f0a5a05",6364:"c83eaecb",6377:"49339ffa",6391:"f1a0996f",6393:"6fcd18b4",6404:"130227bc",6708:"59826336",6950:"dabee6e8",7016:"9debe291",7168:"97eaebbb",7201:"618ed420",7220:"d4f07ae4",7364:"6ea21d64",7370:"c09f4ff7",7399:"119c1f90",7414:"393be207",7494:"8608984a",7747:"da68204b",7808:"515bfcee",7918:"17896441",8024:"5f6488da",8056:"1a925473",8370:"dfe38887",8415:"76b95807",8487:"ed0ffeb6",8584:"d55662b9",9022:"aaf21647",9118:"11823b0c",9287:"9ef353dd",9312:"63ac2ab6",9318:"5024eb1b",9514:"1be78505",9539:"1c94803f",9552:"fc9b1527",9569:"439934bc",9570:"0b565ebd",9575:"0fa5668b",9683:"b132f812",9758:"4eb2dbb6",9785:"416a1f7a",9817:"14eb3368",9932:"e9ae2010",9954:"f2cd1aae"}[e]||e)+"."+{53:"b1238dd8",84:"d14ec78d",177:"25d6f315",247:"36a18531",338:"f1757020",348:"9a4f30fb",352:"38bfce16",427:"b4f6d3ff",448:"61a25eb6",590:"95b0b8ca",594:"391ac5a2",662:"bb472855",667:"f391531a",780:"ac36c8e1",814:"dc8c3a26",1071:"64cd1073",1137:"6254ec5e",1352:"f7b00ee1",1449:"9df954bd",1464:"df33637e",1536:"1274ce14",1652:"ef9b1036",1672:"d1f88e42",1772:"a1a812ec",1948:"17480e7a",2079:"76d0fbec",2164:"b0009b16",2245:"4e15205a",2471:"f84cc69b",2577:"1f0fa502",2781:"70cfd379",2814:"5948bf65",3007:"095c19d2",3085:"3a447380",3198:"c1af2b43",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3244:"b01f590f",3280:"a28d7ef7",3355:"37f00420",3473:"fdffa07c",3699:"e8c71bf1",3947:"92d1ac69",4131:"fc6758c1",4467:"a99cd6a7",4493:"f2d505e9",4512:"0a79f41a",4633:"00053c9b",4635:"fa5ec4ed",4972:"4a54fd4a",5461:"c5f005e1",5528:"dfc5ae3c",5593:"67948b8f",5599:"d6b92f8c",5883:"8e97989d",5901:"d702e07d",5971:"53c215ee",5976:"eccca559",6128:"2c38fb7e",6364:"ba9c260f",6377:"4d58ed9c",6391:"c755c501",6393:"c7a2e68f",6404:"b385b4ba",6708:"b422fe78",6950:"9e49b0b8",7016:"97faded3",7168:"f2feff75",7201:"360f39ab",7220:"4e2ec359",7364:"227484ea",7370:"2180c8ef",7399:"d63d25c1",7414:"f9f4e52e",7494:"698caba6",7747:"90fc3071",7808:"d4e8e285",7918:"e3da5265",8024:"d4057af8",8056:"bf28eab5",8370:"a1fc4a79",8415:"db722672",8487:"5a9bdc4b",8584:"39303453",9022:"6c0788ae",9118:"65c7b1d4",9287:"57eaaaa3",9312:"31428b31",9318:"9cf93a5f",9514:"478c02c6",9539:"04195e12",9552:"c257514f",9569:"bf26bf88",9570:"a68b2cb9",9575:"4095af78",9683:"1acbaae6",9758:"d3b87f29",9785:"58d598d9",9817:"b7ea7ab7",9932:"a961143b",9954:"29c295e3"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},b="portal:",r.l=(e,a,f,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/it/",r.gca=function(e){return e={17896441:"7918",56759256:"3244",59826336:"6708","935f2afb":"53",dcec2ea6:"84","563e9412":"177","945bebc5":"247","7e6d0c69":"338","9e4b59f4":"348",c93659fc:"352","67a31cc6":"427","3b8b137f":"448","1e3a5ca5":"590","73282ac9":"594","4a962f1b":"662",d555297e:"667","4ad31143":"780",cb65eb1c:"1071",c1ebe8a5:"1137","29657cdf":"1352",ef675072:"1449","811999e0":"1464","4eefbb7d":"1536","9b5da377":"1652",a311895f:"1672","73e41789":"1772","197138d8":"1948",e118f683:"2079",adb6ef7e:"2164",dcaa1a88:"2245","526b0ec1":"2471","35dd1768":"2577","5ceaf7f4":"2781","672b0908":"2814",c704d4ed:"3007","1f391b9e":"3085","2122f7d4":"3198",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",dd11ccf7:"3355","81db4688":"3699",b3df89ba:"3947",a698c97b:"4131",eca89e88:"4467","9fbd2421":"4493","1b6a3095":"4512","8a4ba3c9":"4633","8ecc21da":"4635","06fa3bb5":"5461",dec8d80c:"5528","1f04ec67":"5593","66b11570":"5599","058d0cd9":"5883",d8a82e4a:"5901","0a9fd760":"5971",af382ca0:"5976","5f0a5a05":"6128",c83eaecb:"6364","49339ffa":"6377",f1a0996f:"6391","6fcd18b4":"6393","130227bc":"6404",dabee6e8:"6950","9debe291":"7016","97eaebbb":"7168","618ed420":"7201",d4f07ae4:"7220","6ea21d64":"7364",c09f4ff7:"7370","119c1f90":"7399","393be207":"7414","8608984a":"7494",da68204b:"7747","515bfcee":"7808","5f6488da":"8024","1a925473":"8056",dfe38887:"8370","76b95807":"8415",ed0ffeb6:"8487",d55662b9:"8584",aaf21647:"9022","11823b0c":"9118","9ef353dd":"9287","63ac2ab6":"9312","5024eb1b":"9318","1be78505":"9514","1c94803f":"9539",fc9b1527:"9552","439934bc":"9569","0b565ebd":"9570","0fa5668b":"9575",b132f812:"9683","4eb2dbb6":"9758","416a1f7a":"9785","14eb3368":"9817",e9ae2010:"9932",f2cd1aae:"9954"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>d=e[a]=[f,b]));f.push(d[2]=b);var c=r.p+r.u(a),t=new Error;r.l(c,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var b=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,b,c=f[0],t=f[1],o=f[2],n=0;if(c.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/it/docs/category/advanced-cli/index.html b/it/docs/category/advanced-cli/index.html index d9d22839e71..c1c64b269df 100644 --- a/it/docs/category/advanced-cli/index.html +++ b/it/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/category/develop-on-nova-evm-/index.html b/it/docs/category/develop-on-nova-evm-/index.html index 16dcd721149..9c4fff0dcc2 100644 --- a/it/docs/category/develop-on-nova-evm-/index.html +++ b/it/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/it/docs/category/develop/index.html b/it/docs/category/develop/index.html index f2356db2836..b43f2a8ac48 100644 --- a/it/docs/category/develop/index.html +++ b/it/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/category/farming/index.html b/it/docs/category/farming/index.html index b3efac7f3f4..5ae0aff6fc6 100644 --- a/it/docs/category/farming/index.html +++ b/it/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/category/learn/index.html b/it/docs/category/learn/index.html index 39b668b5e6f..93d226f310a 100644 --- a/it/docs/category/learn/index.html +++ b/it/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/category/operators-and-nominators/index.html b/it/docs/category/operators-and-nominators/index.html index 951ab174337..261018ec1fd 100644 --- a/it/docs/category/operators-and-nominators/index.html +++ b/it/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/category/participate/index.html b/it/docs/category/participate/index.html index fa9d1f018e7..e3bcaec56cb 100644 --- a/it/docs/category/participate/index.html +++ b/it/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/category/pulsar-recommended/index.html b/it/docs/category/pulsar-recommended/index.html index 872b4b94e0d..ab0973b76b3 100644 --- a/it/docs/category/pulsar-recommended/index.html +++ b/it/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/category/wallets/index.html b/it/docs/category/wallets/index.html index 3c29bcc8dac..7f77a22e29e 100644 --- a/it/docs/category/wallets/index.html +++ b/it/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/develop/nova/block_explorer/index.html b/it/docs/develop/nova/block_explorer/index.html index fda80ae08c4..a1570f3d26b 100644 --- a/it/docs/develop/nova/block_explorer/index.html +++ b/it/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/develop/nova/faucet/index.html b/it/docs/develop/nova/faucet/index.html index c9fbda26c42..e73e87566a5 100644 --- a/it/docs/develop/nova/faucet/index.html +++ b/it/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/it/docs/develop/nova/foundry_guide/index.html b/it/docs/develop/nova/foundry_guide/index.html index 61e0c4dec09..0a4d8e20cda 100644 --- a/it/docs/develop/nova/foundry_guide/index.html +++ b/it/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/it/docs/develop/nova/general-information/index.html b/it/docs/develop/nova/general-information/index.html index d9f26490d13..41bb5202496 100644 --- a/it/docs/develop/nova/general-information/index.html +++ b/it/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/it/docs/develop/nova/hardhat_guide/index.html b/it/docs/develop/nova/hardhat_guide/index.html index 7eea84a5c3b..3d102f42026 100644 --- a/it/docs/develop/nova/hardhat_guide/index.html +++ b/it/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/it/docs/develop/nova/intro/index.html b/it/docs/develop/nova/intro/index.html index 44cb180d826..1ac9244c917 100644 --- a/it/docs/develop/nova/intro/index.html +++ b/it/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/it/docs/develop/nova/local_development/index.html b/it/docs/develop/nova/local_development/index.html index 0339a7fc880..fffddc6d366 100644 --- a/it/docs/develop/nova/local_development/index.html +++ b/it/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/it/docs/develop/nova/quick_start/index.html b/it/docs/develop/nova/quick_start/index.html index 3120f9dd48a..48d09f7b69b 100644 --- a/it/docs/develop/nova/quick_start/index.html +++ b/it/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/it/docs/develop/nova/remix_guide/index.html b/it/docs/develop/nova/remix_guide/index.html index 4c72028d0e6..1864f6994bf 100644 --- a/it/docs/develop/nova/remix_guide/index.html +++ b/it/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/it/docs/develop/nova/setting-up-metamask/index.html b/it/docs/develop/nova/setting-up-metamask/index.html index 86d7f00586f..e79f3daa691 100644 --- a/it/docs/develop/nova/setting-up-metamask/index.html +++ b/it/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/it/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index bd68963e631..f6cfdaf9479 100644 --- a/it/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/it/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/it/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 4bc04ffd92c..2bac640b12e 100644 --- a/it/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/it/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/it/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index a4a4a8b0879..c9eb33e22f2 100644 --- a/it/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/it/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/it/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 46a0b414f4e..28850d0e7a0 100644 --- a/it/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/it/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/it/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 478141fa017..9613cb9de29 100644 --- a/it/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/it/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/common_problems/index.html b/it/docs/farming-&-staking/farming/common_problems/index.html index fa411ad3781..7b088c7e8f6 100644 --- a/it/docs/farming-&-staking/farming/common_problems/index.html +++ b/it/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/it/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 187934b73bb..496d2afe792 100644 --- a/it/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/it/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/it/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 29939dd256c..a64ef49d735 100644 --- a/it/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/it/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/it/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index eb38061696c..643daaaccb0 100644 --- a/it/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/it/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/it/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 40206a95d90..76fce29f419 100644 --- a/it/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/it/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/index.html b/it/docs/farming-&-staking/index.html index 5f157526fed..204723410c2 100644 --- a/it/docs/farming-&-staking/index.html +++ b/it/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/staking/index.html b/it/docs/farming-&-staking/staking/index.html index 03120c3c709..d32bbcd6b23 100644 --- a/it/docs/farming-&-staking/staking/index.html +++ b/it/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/staking/intro/index.html b/it/docs/farming-&-staking/staking/intro/index.html index b5d576aa3ef..6fb5c2f4cd8 100644 --- a/it/docs/farming-&-staking/staking/intro/index.html +++ b/it/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/staking/operators/index.html b/it/docs/farming-&-staking/staking/operators/index.html index 316d71f2b48..784ad0c70d3 100644 --- a/it/docs/farming-&-staking/staking/operators/index.html +++ b/it/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/timekeeping/index.html b/it/docs/farming-&-staking/timekeeping/index.html index 9b39a787fd7..7c5417981bb 100644 --- a/it/docs/farming-&-staking/timekeeping/index.html +++ b/it/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/wallets/polkadot/index.html b/it/docs/farming-&-staking/wallets/polkadot/index.html index 1d342e9a527..0f02f646ce8 100644 --- a/it/docs/farming-&-staking/wallets/polkadot/index.html +++ b/it/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/it/docs/farming-&-staking/wallets/subwallet/index.html b/it/docs/farming-&-staking/wallets/subwallet/index.html index 37aa213c5c7..f8e6658140b 100644 --- a/it/docs/farming-&-staking/wallets/subwallet/index.html +++ b/it/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/it/docs/learn/intro/index.html b/it/docs/learn/intro/index.html index 97e0615a6ce..9591f5d2f89 100644 --- a/it/docs/learn/intro/index.html +++ b/it/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/it/docs/learn/security/index.html b/it/docs/learn/security/index.html index fdadba5c3bc..32ab7771c5a 100644 --- a/it/docs/learn/security/index.html +++ b/it/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/it/docs/learn/subnomicon/index.html b/it/docs/learn/subnomicon/index.html index ddc32cf35f6..6d8e4d0b7fb 100644 --- a/it/docs/learn/subnomicon/index.html +++ b/it/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/it/docs/participate/CODE_OF_CONDUCT/index.html b/it/docs/participate/CODE_OF_CONDUCT/index.html index 9d5ab7c7de4..53ea09a38e1 100644 --- a/it/docs/participate/CODE_OF_CONDUCT/index.html +++ b/it/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/it/docs/participate/contribute/index.html b/it/docs/participate/contribute/index.html index c9f894286b3..9f1f130873b 100644 --- a/it/docs/participate/contribute/index.html +++ b/it/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/it/docs/participate/index.html b/it/docs/participate/index.html index 64daf9c3f08..8930ebcac0a 100644 --- a/it/docs/participate/index.html +++ b/it/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/it/docs/participate/translate/index.html b/it/docs/participate/translate/index.html index 77b2a55a73e..855a02e463b 100644 --- a/it/docs/participate/translate/index.html +++ b/it/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/category/additional-guides/index.html b/it/docs/pre-release/category/additional-guides/index.html index 775ef26cd1e..291249ad7d9 100644 --- a/it/docs/pre-release/category/additional-guides/index.html +++ b/it/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/advanced-cli/index.html b/it/docs/pre-release/category/advanced-cli/index.html index 1b34468df44..bff5b71480d 100644 --- a/it/docs/pre-release/category/advanced-cli/index.html +++ b/it/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/develop-on-nova-evm-/index.html b/it/docs/pre-release/category/develop-on-nova-evm-/index.html index 8c68ef5d21a..3014da1e226 100644 --- a/it/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/it/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/it/docs/pre-release/category/develop/index.html b/it/docs/pre-release/category/develop/index.html index 61b66cf99f9..b41863b8128 100644 --- a/it/docs/pre-release/category/develop/index.html +++ b/it/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/farming/index.html b/it/docs/pre-release/category/farming/index.html index 2e872bd52e3..85587df235b 100644 --- a/it/docs/pre-release/category/farming/index.html +++ b/it/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/learn/index.html b/it/docs/pre-release/category/learn/index.html index bf9528e8198..c95694e9b8c 100644 --- a/it/docs/pre-release/category/learn/index.html +++ b/it/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/operators-and-nominators/index.html b/it/docs/pre-release/category/operators-and-nominators/index.html index c06f738364e..e15164fd836 100644 --- a/it/docs/pre-release/category/operators-and-nominators/index.html +++ b/it/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/participate/index.html b/it/docs/pre-release/category/participate/index.html index 5a1c7ffbf37..0279b0ba294 100644 --- a/it/docs/pre-release/category/participate/index.html +++ b/it/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/pulsar-recommended/index.html b/it/docs/pre-release/category/pulsar-recommended/index.html index d7f079c5756..b8227e38be6 100644 --- a/it/docs/pre-release/category/pulsar-recommended/index.html +++ b/it/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/category/wallets/index.html b/it/docs/pre-release/category/wallets/index.html index 340ef874eda..64a4888388a 100644 --- a/it/docs/pre-release/category/wallets/index.html +++ b/it/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/block_explorer/index.html b/it/docs/pre-release/develop/nova/block_explorer/index.html index 19b0461c45e..ae3aa5073c4 100644 --- a/it/docs/pre-release/develop/nova/block_explorer/index.html +++ b/it/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/faucet/index.html b/it/docs/pre-release/develop/nova/faucet/index.html index 90591de2104..e29a66b4e42 100644 --- a/it/docs/pre-release/develop/nova/faucet/index.html +++ b/it/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/foundry_guide/index.html b/it/docs/pre-release/develop/nova/foundry_guide/index.html index dcaddbbca32..b00dc327956 100644 --- a/it/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/it/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/general-information/index.html b/it/docs/pre-release/develop/nova/general-information/index.html index 5434c9b2599..39e28137c4e 100644 --- a/it/docs/pre-release/develop/nova/general-information/index.html +++ b/it/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/hardhat_guide/index.html b/it/docs/pre-release/develop/nova/hardhat_guide/index.html index 57f305480b2..db2579e1063 100644 --- a/it/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/it/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/intro/index.html b/it/docs/pre-release/develop/nova/intro/index.html index 35ce54b1aa2..28d83788569 100644 --- a/it/docs/pre-release/develop/nova/intro/index.html +++ b/it/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/local_development/index.html b/it/docs/pre-release/develop/nova/local_development/index.html index 8d5641fb12e..ed4ce3a4fde 100644 --- a/it/docs/pre-release/develop/nova/local_development/index.html +++ b/it/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/quick_start/index.html b/it/docs/pre-release/develop/nova/quick_start/index.html index 0b45e4328a7..e96e5a5b8b7 100644 --- a/it/docs/pre-release/develop/nova/quick_start/index.html +++ b/it/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/remix_guide/index.html b/it/docs/pre-release/develop/nova/remix_guide/index.html index e5411c8703e..0608d44a10b 100644 --- a/it/docs/pre-release/develop/nova/remix_guide/index.html +++ b/it/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/it/docs/pre-release/develop/nova/setting-up-metamask/index.html b/it/docs/pre-release/develop/nova/setting-up-metamask/index.html index 9c35dc4c86e..01dc082200f 100644 --- a/it/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/it/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/it/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 1434fe36638..a1bb4e5bc0c 100644 --- a/it/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 32099db9be9..daff2a92941 100644 --- a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index fde329c0d5a..032596cc62d 100644 --- a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 96d57097130..be04a29e00f 100644 --- a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 64a8b78c962..8503399dc87 100644 --- a/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/it/docs/pre-release/farming-&-staking/farming/common_problems/index.html index c4bba2309ee..dec398b207e 100644 --- a/it/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 5729d58bb54..21f00a3e816 100644 --- a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 3de0e6d6a3c..0ad979f4be5 100644 --- a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index cbd600bbaa4..ef1e4557529 100644 --- a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index be0bdb9633b..f67a39fcbe5 100644 --- a/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/it/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/index.html b/it/docs/pre-release/farming-&-staking/index.html index 74c545c80eb..46e22d3db39 100644 --- a/it/docs/pre-release/farming-&-staking/index.html +++ b/it/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/staking/index.html b/it/docs/pre-release/farming-&-staking/staking/index.html index c76b3e41fd4..32d2bd6a28c 100644 --- a/it/docs/pre-release/farming-&-staking/staking/index.html +++ b/it/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/staking/intro/index.html b/it/docs/pre-release/farming-&-staking/staking/intro/index.html index 23838016fb1..0c38727b40c 100644 --- a/it/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/it/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/staking/operators/index.html b/it/docs/pre-release/farming-&-staking/staking/operators/index.html index 2d427cbcab7..239f1b77d29 100644 --- a/it/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/it/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/timekeeping/index.html b/it/docs/pre-release/farming-&-staking/timekeeping/index.html index 01b2af07226..2376b6d08cb 100644 --- a/it/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/it/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/it/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 5f0a775ee3a..adb68a62ced 100644 --- a/it/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/it/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/it/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/it/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index 290ffb4da3e..33aca05bf48 100644 --- a/it/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/it/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/it/docs/pre-release/learn/intro/index.html b/it/docs/pre-release/learn/intro/index.html index ef42fcd4f9d..eccb5599a42 100644 --- a/it/docs/pre-release/learn/intro/index.html +++ b/it/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/it/docs/pre-release/learn/security/index.html b/it/docs/pre-release/learn/security/index.html index d3663c534ea..202561aaeb6 100644 --- a/it/docs/pre-release/learn/security/index.html +++ b/it/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/learn/subnomicon/index.html b/it/docs/pre-release/learn/subnomicon/index.html index 7bcf3ccb7dd..1c125609db9 100644 --- a/it/docs/pre-release/learn/subnomicon/index.html +++ b/it/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/it/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/it/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 3e7f9f6a9cb..10290539ae0 100644 --- a/it/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/it/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/participate/contribute/index.html b/it/docs/pre-release/participate/contribute/index.html index 5313972f9cd..0988c1fb400 100644 --- a/it/docs/pre-release/participate/contribute/index.html +++ b/it/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/it/docs/pre-release/participate/index.html b/it/docs/pre-release/participate/index.html index 8b35e23782e..2a801e71552 100644 --- a/it/docs/pre-release/participate/index.html +++ b/it/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/it/docs/pre-release/participate/translate/index.html b/it/docs/pre-release/participate/translate/index.html index 97b38765c55..1c131438323 100644 --- a/it/docs/pre-release/participate/translate/index.html +++ b/it/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/it/index.html b/it/index.html index d8872f2659e..97f0cdbf579 100644 --- a/it/index.html +++ b/it/index.html @@ -7,13 +7,13 @@ - +

    Coltiva da Ovunque

    Guadagna ricompense eseguendo un nodo agricoltore impegnando un disco di riserva. Non è richiesta alcuna configurazione costosa o capitale iniziale.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/it/markdown-page/index.html b/it/markdown-page/index.html index d8c4cd16857..7cc661c1143 100644 --- a/it/markdown-page/index.html +++ b/it/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/404.html b/ja/404.html index 4c0f244f69f..c49bf9f8be0 100644 --- a/ja/404.html +++ b/ja/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/assets/js/31c19c13.55cbcc8e.js b/ja/assets/js/31c19c13.55cbcc8e.js deleted file mode 100644 index 3e072010d63..00000000000 --- a/ja/assets/js/31c19c13.55cbcc8e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4985],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},6254:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ja/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ja/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ja/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ja/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ja/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ja/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ja/assets/js/31c19c13.735cd902.js b/ja/assets/js/31c19c13.735cd902.js new file mode 100644 index 00000000000..0a364fdb36f --- /dev/null +++ b/ja/assets/js/31c19c13.735cd902.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[4985],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},6254:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ja/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ja/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ja/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ja/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ja/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ja/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ja/assets/js/70434e37.017a88ee.js b/ja/assets/js/70434e37.017a88ee.js new file mode 100644 index 00000000000..ad451be3047 --- /dev/null +++ b/ja/assets/js/70434e37.017a88ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8742],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},3688:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ja/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ja/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ja/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ja/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ja/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ja/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ja/assets/js/70434e37.d33d50db.js b/ja/assets/js/70434e37.d33d50db.js deleted file mode 100644 index 6246ab8f2b2..00000000000 --- a/ja/assets/js/70434e37.d33d50db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8742],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},3688:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ja/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ja/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ja/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ja/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ja/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ja/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ja/assets/js/runtime~main.81ce6b58.js b/ja/assets/js/runtime~main.6f5c767c.js similarity index 98% rename from ja/assets/js/runtime~main.81ce6b58.js rename to ja/assets/js/runtime~main.6f5c767c.js index b8c521afe41..541595fd3a9 100644 --- a/ja/assets/js/runtime~main.81ce6b58.js +++ b/ja/assets/js/runtime~main.6f5c767c.js @@ -1 +1 @@ -(()=>{"use strict";var e,c,f,a,b,d={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(c,f,a,b)=>{if(!f){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,a,b]},r.n=e=>{var c=e&&e.__esModule?()=>e.default:()=>e;return r.d(c,{a:c}),c},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};c=c||[null,f({}),f([]),f(f)];for(var t=2&a&&e;"object"==typeof t&&!~c.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((c=>d[c]=()=>e[c]));return d.default=()=>e,r.d(b,d),b},r.d=(e,c)=>{for(var f in c)r.o(c,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:c[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((c,f)=>(r.f[f](e,c),c)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",359:"f58a6a07",408:"69e5d8ce",603:"ce4c2428",733:"a1018bbc",872:"c3eafa00",1063:"8727738b",1135:"c8b529f1",1215:"7ee2c584",1840:"6cfb7163",1989:"4ab2ee31",2116:"2da9abf1",2248:"c4b86b81",2485:"c0bd77ab",2782:"6077a99a",2818:"ae8b3650",2847:"fa198208",3047:"7a816c7b",3059:"96100b9b",3085:"1f391b9e",3118:"cfae2dc0",3154:"2ba42a05",3204:"3f0f1dcd",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3536:"b85b0c16",3568:"78f16148",3585:"37945b60",3647:"db8acfac",3676:"86a3d108",3679:"956c9e49",3683:"d3652d43",3687:"9b96c215",3814:"0b1ab1c9",3863:"29d2f4d0",3934:"2e948be8",4028:"f7f59073",4326:"78772e33",4370:"9745df56",4399:"180bdfca",4497:"a1ecc387",4652:"f3e52a52",4784:"ff34c169",4891:"a48bd696",4985:"31c19c13",5013:"d3d02044",5077:"72f91de1",5115:"b97d9c9f",5117:"b61d460e",5157:"031142fe",5188:"4585100a",5378:"52e88af4",5454:"6bdd239e",5513:"e122e195",5629:"87bca7bb",5639:"7ba66200",5773:"8cb9b62e",5806:"b71dfc1e",5939:"b3723747",6216:"9d85b690",6287:"55d9cbca",6474:"bd3b5e8d",6526:"286fedf6",6546:"73f6e136",6662:"409274be",6714:"86628745",6752:"49894f9b",6771:"7b97c9c6",6797:"9d295c75",6873:"5cbb02aa",6911:"75488ad3",7031:"4fe12c78",7122:"3b8fab0b",7270:"e55e0fac",7316:"d3934553",7370:"c09f4ff7",7414:"393be207",7476:"f61a3471",7602:"d8585316",7918:"17896441",8064:"ccc72d4c",8167:"906277d0",8206:"817d17e4",8300:"f8f0d17c",8676:"dd249ccc",8683:"42acddc1",8742:"70434e37",8834:"90c53dc6",9008:"ca0f3604",9038:"3ded65f7",9498:"3676423a",9514:"1be78505",9530:"027b2109",9760:"e91ff41d",9817:"14eb3368",9863:"fb012c88",9964:"fbe6ec2a"}[e]||e)+"."+{53:"2937051d",359:"74a1b0ae",408:"6245d56d",603:"96b51264",733:"32f55ac7",814:"dc8c3a26",872:"f42a1aef",1063:"a012dcdc",1135:"a3dcfd64",1215:"28728eea",1840:"cdcf6b0d",1989:"4c1cf236",2116:"6b6cc32f",2248:"5180ed8c",2485:"d02424e1",2782:"1bcd3468",2818:"1aa979eb",2847:"2cab86ce",3047:"a5e2ab31",3059:"a17bc4ab",3085:"3a447380",3118:"4d35c4e2",3154:"cd589ed6",3203:"c0b8bfe8",3204:"6248f729",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3473:"fdffa07c",3536:"91416484",3568:"fe0932fa",3585:"cbbfe8b6",3647:"592a08b7",3676:"fc72d6f5",3679:"81a2f05f",3683:"47a4a7bf",3687:"66f73abd",3814:"c4645f48",3863:"34823658",3934:"92cef622",4028:"0b56e5a7",4326:"9106e5ca",4370:"ce997117",4399:"4761c98a",4497:"064f5fa5",4652:"0b694341",4784:"493e3130",4891:"0adc10c8",4972:"4a54fd4a",4985:"55cbcc8e",5013:"b1ac6515",5077:"addea662",5115:"fd936658",5117:"aba64273",5157:"d1ac639f",5188:"974c117f",5378:"b0e70dfa",5454:"b08dbb0b",5513:"8233bc01",5629:"b7782eee",5639:"531e5570",5773:"01bbdc4b",5806:"70544f13",5939:"42b55c52",6216:"2d322fe6",6287:"cb3540f3",6474:"7c398dec",6526:"a12e9171",6546:"84d2f7b0",6662:"d04b705c",6714:"ebc7b729",6752:"75336364",6771:"251a9f8c",6797:"03df64f3",6873:"820fec95",6911:"1f017b31",7031:"6b19d77c",7122:"0b8c4ffa",7270:"36ebf0b0",7316:"c90af76d",7370:"164c716b",7414:"4819fc5b",7476:"3345dc05",7602:"b18d4f6a",7918:"e3da5265",8064:"ae6b5fd2",8167:"868c6602",8206:"d93b93a2",8300:"6f17ccc1",8676:"8d457c0a",8683:"641a6bf4",8742:"d33d50db",8834:"9f6c04ef",9008:"4ddb5af7",9038:"8efa8da2",9498:"a3ec9993",9514:"478c02c6",9530:"d0070903",9760:"4ede56af",9817:"b7ea7ab7",9863:"c7392ae5",9964:"c547b38f"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,c)=>Object.prototype.hasOwnProperty.call(e,c),a={},b="portal:",r.l=(e,c,f,d)=>{if(a[e])a[e].push(c);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=a[e];if(delete a[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),c)return c(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/ja/",r.gca=function(e){return e={17896441:"7918",86628745:"6714","935f2afb":"53",f58a6a07:"359","69e5d8ce":"408",ce4c2428:"603",a1018bbc:"733",c3eafa00:"872","8727738b":"1063",c8b529f1:"1135","7ee2c584":"1215","6cfb7163":"1840","4ab2ee31":"1989","2da9abf1":"2116",c4b86b81:"2248",c0bd77ab:"2485","6077a99a":"2782",ae8b3650:"2818",fa198208:"2847","7a816c7b":"3047","96100b9b":"3059","1f391b9e":"3085",cfae2dc0:"3118","2ba42a05":"3154","3f0f1dcd":"3204",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",b85b0c16:"3536","78f16148":"3568","37945b60":"3585",db8acfac:"3647","86a3d108":"3676","956c9e49":"3679",d3652d43:"3683","9b96c215":"3687","0b1ab1c9":"3814","29d2f4d0":"3863","2e948be8":"3934",f7f59073:"4028","78772e33":"4326","9745df56":"4370","180bdfca":"4399",a1ecc387:"4497",f3e52a52:"4652",ff34c169:"4784",a48bd696:"4891","31c19c13":"4985",d3d02044:"5013","72f91de1":"5077",b97d9c9f:"5115",b61d460e:"5117","031142fe":"5157","4585100a":"5188","52e88af4":"5378","6bdd239e":"5454",e122e195:"5513","87bca7bb":"5629","7ba66200":"5639","8cb9b62e":"5773",b71dfc1e:"5806",b3723747:"5939","9d85b690":"6216","55d9cbca":"6287",bd3b5e8d:"6474","286fedf6":"6526","73f6e136":"6546","409274be":"6662","49894f9b":"6752","7b97c9c6":"6771","9d295c75":"6797","5cbb02aa":"6873","75488ad3":"6911","4fe12c78":"7031","3b8fab0b":"7122",e55e0fac:"7270",d3934553:"7316",c09f4ff7:"7370","393be207":"7414",f61a3471:"7476",d8585316:"7602",ccc72d4c:"8064","906277d0":"8167","817d17e4":"8206",f8f0d17c:"8300",dd249ccc:"8676","42acddc1":"8683","70434e37":"8742","90c53dc6":"8834",ca0f3604:"9008","3ded65f7":"9038","3676423a":"9498","1be78505":"9514","027b2109":"9530",e91ff41d:"9760","14eb3368":"9817",fb012c88:"9863",fbe6ec2a:"9964"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(c,f)=>{var a=r.o(e,c)?e[c]:void 0;if(0!==a)if(a)f.push(a[2]);else if(/^(1303|532)$/.test(c))e[c]=0;else{var b=new Promise(((f,b)=>a=e[c]=[f,b]));f.push(a[2]=b);var d=r.p+r.u(c),t=new Error;r.l(d,(f=>{if(r.o(e,c)&&(0!==(a=e[c])&&(e[c]=void 0),a)){var b=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+c+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,a[1](t)}}),"chunk-"+c,c)}},r.O.j=c=>0===e[c];var c=(c,f)=>{var a,b,d=f[0],t=f[1],o=f[2],n=0;if(d.some((c=>0!==e[c]))){for(a in t)r.o(t,a)&&(r.m[a]=t[a]);if(o)var i=o(r)}for(c&&c(f);n{"use strict";var e,c,f,a,b,d={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(c,f,a,b)=>{if(!f){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,a,b]},r.n=e=>{var c=e&&e.__esModule?()=>e.default:()=>e;return r.d(c,{a:c}),c},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};c=c||[null,f({}),f([]),f(f)];for(var t=2&a&&e;"object"==typeof t&&!~c.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((c=>d[c]=()=>e[c]));return d.default=()=>e,r.d(b,d),b},r.d=(e,c)=>{for(var f in c)r.o(c,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:c[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((c,f)=>(r.f[f](e,c),c)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",359:"f58a6a07",408:"69e5d8ce",603:"ce4c2428",733:"a1018bbc",872:"c3eafa00",1063:"8727738b",1135:"c8b529f1",1215:"7ee2c584",1840:"6cfb7163",1989:"4ab2ee31",2116:"2da9abf1",2248:"c4b86b81",2485:"c0bd77ab",2782:"6077a99a",2818:"ae8b3650",2847:"fa198208",3047:"7a816c7b",3059:"96100b9b",3085:"1f391b9e",3118:"cfae2dc0",3154:"2ba42a05",3204:"3f0f1dcd",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3536:"b85b0c16",3568:"78f16148",3585:"37945b60",3647:"db8acfac",3676:"86a3d108",3679:"956c9e49",3683:"d3652d43",3687:"9b96c215",3814:"0b1ab1c9",3863:"29d2f4d0",3934:"2e948be8",4028:"f7f59073",4326:"78772e33",4370:"9745df56",4399:"180bdfca",4497:"a1ecc387",4652:"f3e52a52",4784:"ff34c169",4891:"a48bd696",4985:"31c19c13",5013:"d3d02044",5077:"72f91de1",5115:"b97d9c9f",5117:"b61d460e",5157:"031142fe",5188:"4585100a",5378:"52e88af4",5454:"6bdd239e",5513:"e122e195",5629:"87bca7bb",5639:"7ba66200",5773:"8cb9b62e",5806:"b71dfc1e",5939:"b3723747",6216:"9d85b690",6287:"55d9cbca",6474:"bd3b5e8d",6526:"286fedf6",6546:"73f6e136",6662:"409274be",6714:"86628745",6752:"49894f9b",6771:"7b97c9c6",6797:"9d295c75",6873:"5cbb02aa",6911:"75488ad3",7031:"4fe12c78",7122:"3b8fab0b",7270:"e55e0fac",7316:"d3934553",7370:"c09f4ff7",7414:"393be207",7476:"f61a3471",7602:"d8585316",7918:"17896441",8064:"ccc72d4c",8167:"906277d0",8206:"817d17e4",8300:"f8f0d17c",8676:"dd249ccc",8683:"42acddc1",8742:"70434e37",8834:"90c53dc6",9008:"ca0f3604",9038:"3ded65f7",9498:"3676423a",9514:"1be78505",9530:"027b2109",9760:"e91ff41d",9817:"14eb3368",9863:"fb012c88",9964:"fbe6ec2a"}[e]||e)+"."+{53:"2937051d",359:"74a1b0ae",408:"6245d56d",603:"96b51264",733:"32f55ac7",814:"dc8c3a26",872:"f42a1aef",1063:"a012dcdc",1135:"a3dcfd64",1215:"28728eea",1840:"cdcf6b0d",1989:"4c1cf236",2116:"6b6cc32f",2248:"5180ed8c",2485:"d02424e1",2782:"1bcd3468",2818:"1aa979eb",2847:"2cab86ce",3047:"a5e2ab31",3059:"a17bc4ab",3085:"3a447380",3118:"4d35c4e2",3154:"cd589ed6",3203:"c0b8bfe8",3204:"6248f729",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3473:"fdffa07c",3536:"91416484",3568:"fe0932fa",3585:"cbbfe8b6",3647:"592a08b7",3676:"fc72d6f5",3679:"81a2f05f",3683:"47a4a7bf",3687:"66f73abd",3814:"c4645f48",3863:"34823658",3934:"92cef622",4028:"0b56e5a7",4326:"9106e5ca",4370:"ce997117",4399:"4761c98a",4497:"064f5fa5",4652:"0b694341",4784:"493e3130",4891:"0adc10c8",4972:"4a54fd4a",4985:"735cd902",5013:"b1ac6515",5077:"addea662",5115:"fd936658",5117:"aba64273",5157:"d1ac639f",5188:"974c117f",5378:"b0e70dfa",5454:"b08dbb0b",5513:"8233bc01",5629:"b7782eee",5639:"531e5570",5773:"01bbdc4b",5806:"70544f13",5939:"42b55c52",6216:"2d322fe6",6287:"cb3540f3",6474:"7c398dec",6526:"a12e9171",6546:"84d2f7b0",6662:"d04b705c",6714:"ebc7b729",6752:"75336364",6771:"251a9f8c",6797:"03df64f3",6873:"820fec95",6911:"1f017b31",7031:"6b19d77c",7122:"0b8c4ffa",7270:"36ebf0b0",7316:"c90af76d",7370:"164c716b",7414:"4819fc5b",7476:"3345dc05",7602:"b18d4f6a",7918:"e3da5265",8064:"ae6b5fd2",8167:"868c6602",8206:"d93b93a2",8300:"6f17ccc1",8676:"8d457c0a",8683:"641a6bf4",8742:"017a88ee",8834:"9f6c04ef",9008:"4ddb5af7",9038:"8efa8da2",9498:"a3ec9993",9514:"478c02c6",9530:"d0070903",9760:"4ede56af",9817:"b7ea7ab7",9863:"c7392ae5",9964:"c547b38f"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,c)=>Object.prototype.hasOwnProperty.call(e,c),a={},b="portal:",r.l=(e,c,f,d)=>{if(a[e])a[e].push(c);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=a[e];if(delete a[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),c)return c(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/ja/",r.gca=function(e){return e={17896441:"7918",86628745:"6714","935f2afb":"53",f58a6a07:"359","69e5d8ce":"408",ce4c2428:"603",a1018bbc:"733",c3eafa00:"872","8727738b":"1063",c8b529f1:"1135","7ee2c584":"1215","6cfb7163":"1840","4ab2ee31":"1989","2da9abf1":"2116",c4b86b81:"2248",c0bd77ab:"2485","6077a99a":"2782",ae8b3650:"2818",fa198208:"2847","7a816c7b":"3047","96100b9b":"3059","1f391b9e":"3085",cfae2dc0:"3118","2ba42a05":"3154","3f0f1dcd":"3204",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",b85b0c16:"3536","78f16148":"3568","37945b60":"3585",db8acfac:"3647","86a3d108":"3676","956c9e49":"3679",d3652d43:"3683","9b96c215":"3687","0b1ab1c9":"3814","29d2f4d0":"3863","2e948be8":"3934",f7f59073:"4028","78772e33":"4326","9745df56":"4370","180bdfca":"4399",a1ecc387:"4497",f3e52a52:"4652",ff34c169:"4784",a48bd696:"4891","31c19c13":"4985",d3d02044:"5013","72f91de1":"5077",b97d9c9f:"5115",b61d460e:"5117","031142fe":"5157","4585100a":"5188","52e88af4":"5378","6bdd239e":"5454",e122e195:"5513","87bca7bb":"5629","7ba66200":"5639","8cb9b62e":"5773",b71dfc1e:"5806",b3723747:"5939","9d85b690":"6216","55d9cbca":"6287",bd3b5e8d:"6474","286fedf6":"6526","73f6e136":"6546","409274be":"6662","49894f9b":"6752","7b97c9c6":"6771","9d295c75":"6797","5cbb02aa":"6873","75488ad3":"6911","4fe12c78":"7031","3b8fab0b":"7122",e55e0fac:"7270",d3934553:"7316",c09f4ff7:"7370","393be207":"7414",f61a3471:"7476",d8585316:"7602",ccc72d4c:"8064","906277d0":"8167","817d17e4":"8206",f8f0d17c:"8300",dd249ccc:"8676","42acddc1":"8683","70434e37":"8742","90c53dc6":"8834",ca0f3604:"9008","3ded65f7":"9038","3676423a":"9498","1be78505":"9514","027b2109":"9530",e91ff41d:"9760","14eb3368":"9817",fb012c88:"9863",fbe6ec2a:"9964"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(c,f)=>{var a=r.o(e,c)?e[c]:void 0;if(0!==a)if(a)f.push(a[2]);else if(/^(1303|532)$/.test(c))e[c]=0;else{var b=new Promise(((f,b)=>a=e[c]=[f,b]));f.push(a[2]=b);var d=r.p+r.u(c),t=new Error;r.l(d,(f=>{if(r.o(e,c)&&(0!==(a=e[c])&&(e[c]=void 0),a)){var b=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+c+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,a[1](t)}}),"chunk-"+c,c)}},r.O.j=c=>0===e[c];var c=(c,f)=>{var a,b,d=f[0],t=f[1],o=f[2],n=0;if(d.some((c=>0!==e[c]))){for(a in t)r.o(t,a)&&(r.m[a]=t[a]);if(o)var i=o(r)}for(c&&c(f);n - + - + \ No newline at end of file diff --git a/ja/docs/category/advanced-cli/index.html b/ja/docs/category/advanced-cli/index.html index 9ca8a6be222..6349ce1953a 100644 --- a/ja/docs/category/advanced-cli/index.html +++ b/ja/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/category/develop-on-nova-evm-/index.html b/ja/docs/category/develop-on-nova-evm-/index.html index 0b6b8a0b87a..09de980a3bb 100644 --- a/ja/docs/category/develop-on-nova-evm-/index.html +++ b/ja/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ja/docs/category/develop/index.html b/ja/docs/category/develop/index.html index dbd973bab99..8a4a41a62df 100644 --- a/ja/docs/category/develop/index.html +++ b/ja/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/category/farming/index.html b/ja/docs/category/farming/index.html index 7dbf98fc857..703202602a3 100644 --- a/ja/docs/category/farming/index.html +++ b/ja/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/category/learn/index.html b/ja/docs/category/learn/index.html index ba3f8b9f601..855cfd66a71 100644 --- a/ja/docs/category/learn/index.html +++ b/ja/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/category/operators-and-nominators/index.html b/ja/docs/category/operators-and-nominators/index.html index 91dc7ce87d6..ed821618c6d 100644 --- a/ja/docs/category/operators-and-nominators/index.html +++ b/ja/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/category/participate/index.html b/ja/docs/category/participate/index.html index 8bf4c763975..aa37c4a5642 100644 --- a/ja/docs/category/participate/index.html +++ b/ja/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/category/pulsar-recommended/index.html b/ja/docs/category/pulsar-recommended/index.html index 8141b75ff26..2e890046a9c 100644 --- a/ja/docs/category/pulsar-recommended/index.html +++ b/ja/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/category/wallets/index.html b/ja/docs/category/wallets/index.html index 9623b217a96..b6c02f839e4 100644 --- a/ja/docs/category/wallets/index.html +++ b/ja/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/develop/nova/block_explorer/index.html b/ja/docs/develop/nova/block_explorer/index.html index 8f46406c147..7ef52cd44d6 100644 --- a/ja/docs/develop/nova/block_explorer/index.html +++ b/ja/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/develop/nova/faucet/index.html b/ja/docs/develop/nova/faucet/index.html index fa5dc11c9c2..44bb90d8c89 100644 --- a/ja/docs/develop/nova/faucet/index.html +++ b/ja/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/ja/docs/develop/nova/foundry_guide/index.html b/ja/docs/develop/nova/foundry_guide/index.html index 45588f5998f..db09ddefc4b 100644 --- a/ja/docs/develop/nova/foundry_guide/index.html +++ b/ja/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/ja/docs/develop/nova/general-information/index.html b/ja/docs/develop/nova/general-information/index.html index 54250ead60c..8e1e2b97302 100644 --- a/ja/docs/develop/nova/general-information/index.html +++ b/ja/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/ja/docs/develop/nova/hardhat_guide/index.html b/ja/docs/develop/nova/hardhat_guide/index.html index 9926bc85e3e..625ec8d6db5 100644 --- a/ja/docs/develop/nova/hardhat_guide/index.html +++ b/ja/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/ja/docs/develop/nova/intro/index.html b/ja/docs/develop/nova/intro/index.html index a6cf80c9540..7b9a705394b 100644 --- a/ja/docs/develop/nova/intro/index.html +++ b/ja/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/ja/docs/develop/nova/local_development/index.html b/ja/docs/develop/nova/local_development/index.html index 3150ca3633d..75d6c7c56f2 100644 --- a/ja/docs/develop/nova/local_development/index.html +++ b/ja/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/ja/docs/develop/nova/quick_start/index.html b/ja/docs/develop/nova/quick_start/index.html index 2be16636603..43e66756be5 100644 --- a/ja/docs/develop/nova/quick_start/index.html +++ b/ja/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/ja/docs/develop/nova/remix_guide/index.html b/ja/docs/develop/nova/remix_guide/index.html index 9d0da7d9c41..fa11f2500f7 100644 --- a/ja/docs/develop/nova/remix_guide/index.html +++ b/ja/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/ja/docs/develop/nova/setting-up-metamask/index.html b/ja/docs/develop/nova/setting-up-metamask/index.html index e471d4e08a6..fe79c89da54 100644 --- a/ja/docs/develop/nova/setting-up-metamask/index.html +++ b/ja/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/ja/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 82caf2bcca0..2b69b902296 100644 --- a/ja/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/ja/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/ja/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index ab1439a77ca..4b287bebc2f 100644 --- a/ja/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/ja/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/ja/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 530e8c8d88a..56301d94f33 100644 --- a/ja/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/ja/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/ja/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 6c755a3ad82..64c818173a1 100644 --- a/ja/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/ja/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/ja/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 4b9055bd0fe..48ead1d0bbc 100644 --- a/ja/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/ja/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/common_problems/index.html b/ja/docs/farming-&-staking/farming/common_problems/index.html index 4a379394dd3..25395ad898f 100644 --- a/ja/docs/farming-&-staking/farming/common_problems/index.html +++ b/ja/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/ja/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index df4611fcbb2..b5b36e7712c 100644 --- a/ja/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/ja/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/ja/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 99ffb1e172e..147de71ad94 100644 --- a/ja/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/ja/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/ja/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index c2ae03c12fb..7bf19ea70e7 100644 --- a/ja/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/ja/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/ja/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 24759194a36..c574ec9ab19 100644 --- a/ja/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/ja/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/index.html b/ja/docs/farming-&-staking/index.html index 0fd7ab35f3b..55a3148ccb0 100644 --- a/ja/docs/farming-&-staking/index.html +++ b/ja/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/staking/index.html b/ja/docs/farming-&-staking/staking/index.html index 7b3410ed3c1..8738d75adf2 100644 --- a/ja/docs/farming-&-staking/staking/index.html +++ b/ja/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/staking/intro/index.html b/ja/docs/farming-&-staking/staking/intro/index.html index 7c0a3d6f983..1d7bc02eb58 100644 --- a/ja/docs/farming-&-staking/staking/intro/index.html +++ b/ja/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/staking/operators/index.html b/ja/docs/farming-&-staking/staking/operators/index.html index c8b14da8b09..fd720ebaf7a 100644 --- a/ja/docs/farming-&-staking/staking/operators/index.html +++ b/ja/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/timekeeping/index.html b/ja/docs/farming-&-staking/timekeeping/index.html index 5ab79ea70ef..14fd488d863 100644 --- a/ja/docs/farming-&-staking/timekeeping/index.html +++ b/ja/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/wallets/polkadot/index.html b/ja/docs/farming-&-staking/wallets/polkadot/index.html index 3020e738e61..660c9f3f796 100644 --- a/ja/docs/farming-&-staking/wallets/polkadot/index.html +++ b/ja/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/ja/docs/farming-&-staking/wallets/subwallet/index.html b/ja/docs/farming-&-staking/wallets/subwallet/index.html index c28e47f9861..45a6babf56e 100644 --- a/ja/docs/farming-&-staking/wallets/subwallet/index.html +++ b/ja/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/ja/docs/learn/intro/index.html b/ja/docs/learn/intro/index.html index 45c2bdfb23b..91bb6d884f4 100644 --- a/ja/docs/learn/intro/index.html +++ b/ja/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/ja/docs/learn/security/index.html b/ja/docs/learn/security/index.html index 131710e29ae..e05e0828870 100644 --- a/ja/docs/learn/security/index.html +++ b/ja/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/ja/docs/learn/subnomicon/index.html b/ja/docs/learn/subnomicon/index.html index aa075c80a76..9d04d3582e3 100644 --- a/ja/docs/learn/subnomicon/index.html +++ b/ja/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/ja/docs/participate/CODE_OF_CONDUCT/index.html b/ja/docs/participate/CODE_OF_CONDUCT/index.html index d5f699a6c9a..409d723d853 100644 --- a/ja/docs/participate/CODE_OF_CONDUCT/index.html +++ b/ja/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/ja/docs/participate/contribute/index.html b/ja/docs/participate/contribute/index.html index 5a051bc0513..1ee4e668f2f 100644 --- a/ja/docs/participate/contribute/index.html +++ b/ja/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/ja/docs/participate/index.html b/ja/docs/participate/index.html index 91d045e7e4c..5faf9aeffa6 100644 --- a/ja/docs/participate/index.html +++ b/ja/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/ja/docs/participate/translate/index.html b/ja/docs/participate/translate/index.html index 907dfae8002..6dde77cc4b9 100644 --- a/ja/docs/participate/translate/index.html +++ b/ja/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/additional-guides/index.html b/ja/docs/pre-release/category/additional-guides/index.html index a1a16794523..6c0c420bfa7 100644 --- a/ja/docs/pre-release/category/additional-guides/index.html +++ b/ja/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/advanced-cli/index.html b/ja/docs/pre-release/category/advanced-cli/index.html index ab43e21bc29..62164cdede2 100644 --- a/ja/docs/pre-release/category/advanced-cli/index.html +++ b/ja/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/develop-on-nova-evm-/index.html b/ja/docs/pre-release/category/develop-on-nova-evm-/index.html index f5cd8f09c31..307ad99e69d 100644 --- a/ja/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/ja/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/develop/index.html b/ja/docs/pre-release/category/develop/index.html index 6126e8b725c..55724186835 100644 --- a/ja/docs/pre-release/category/develop/index.html +++ b/ja/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/farming/index.html b/ja/docs/pre-release/category/farming/index.html index 5254b079a76..6ab2f06334d 100644 --- a/ja/docs/pre-release/category/farming/index.html +++ b/ja/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/learn/index.html b/ja/docs/pre-release/category/learn/index.html index a80d57f7fb9..c169706d25b 100644 --- a/ja/docs/pre-release/category/learn/index.html +++ b/ja/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/operators-and-nominators/index.html b/ja/docs/pre-release/category/operators-and-nominators/index.html index c51b4f7e46e..b0412becd72 100644 --- a/ja/docs/pre-release/category/operators-and-nominators/index.html +++ b/ja/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/participate/index.html b/ja/docs/pre-release/category/participate/index.html index 9e87665f81c..54a154ef5e7 100644 --- a/ja/docs/pre-release/category/participate/index.html +++ b/ja/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/pulsar-recommended/index.html b/ja/docs/pre-release/category/pulsar-recommended/index.html index 8edc666c161..72183e5184d 100644 --- a/ja/docs/pre-release/category/pulsar-recommended/index.html +++ b/ja/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/category/wallets/index.html b/ja/docs/pre-release/category/wallets/index.html index d5bc3347efd..8a0da0e021b 100644 --- a/ja/docs/pre-release/category/wallets/index.html +++ b/ja/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/block_explorer/index.html b/ja/docs/pre-release/develop/nova/block_explorer/index.html index a67c06a616b..3cbb70f48af 100644 --- a/ja/docs/pre-release/develop/nova/block_explorer/index.html +++ b/ja/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/faucet/index.html b/ja/docs/pre-release/develop/nova/faucet/index.html index 1eff14c3817..78d9a7c4e6d 100644 --- a/ja/docs/pre-release/develop/nova/faucet/index.html +++ b/ja/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/foundry_guide/index.html b/ja/docs/pre-release/develop/nova/foundry_guide/index.html index 35d8a668daa..4b20f7ae559 100644 --- a/ja/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/ja/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/general-information/index.html b/ja/docs/pre-release/develop/nova/general-information/index.html index 460ba591d82..4142be2bd6b 100644 --- a/ja/docs/pre-release/develop/nova/general-information/index.html +++ b/ja/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/hardhat_guide/index.html b/ja/docs/pre-release/develop/nova/hardhat_guide/index.html index b80ee25da5f..3171a8330a9 100644 --- a/ja/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/ja/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/intro/index.html b/ja/docs/pre-release/develop/nova/intro/index.html index e25085a822b..f8347b2cffb 100644 --- a/ja/docs/pre-release/develop/nova/intro/index.html +++ b/ja/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/local_development/index.html b/ja/docs/pre-release/develop/nova/local_development/index.html index c5083b75dbc..11d1368d71f 100644 --- a/ja/docs/pre-release/develop/nova/local_development/index.html +++ b/ja/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/quick_start/index.html b/ja/docs/pre-release/develop/nova/quick_start/index.html index 4f71f507f0c..2a1342788f9 100644 --- a/ja/docs/pre-release/develop/nova/quick_start/index.html +++ b/ja/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/remix_guide/index.html b/ja/docs/pre-release/develop/nova/remix_guide/index.html index 280b4aca5a4..783e67594a3 100644 --- a/ja/docs/pre-release/develop/nova/remix_guide/index.html +++ b/ja/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/develop/nova/setting-up-metamask/index.html b/ja/docs/pre-release/develop/nova/setting-up-metamask/index.html index ed91083ce19..e471ca8621c 100644 --- a/ja/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/ja/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/ja/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 8d9377024d8..b032e942281 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index c5ee21f07b9..23c3398d694 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 110231a146f..8e7ea879a15 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 89572a31c0e..3726e0cfa78 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 524d6547271..b0578624f9b 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/ja/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 1b75785dc0d..3acb5c212f0 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 50e1219d852..a9cb8b391b8 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 79f78055a6c..9b185ada94b 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 8492c46c0eb..6c5a830e9f6 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 57a97fcf79a..6b7cb421cef 100644 --- a/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/ja/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/index.html b/ja/docs/pre-release/farming-&-staking/index.html index 413b347d472..7c7de395aef 100644 --- a/ja/docs/pre-release/farming-&-staking/index.html +++ b/ja/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/staking/index.html b/ja/docs/pre-release/farming-&-staking/staking/index.html index 53d006aa0ba..d41fac3125f 100644 --- a/ja/docs/pre-release/farming-&-staking/staking/index.html +++ b/ja/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/staking/intro/index.html b/ja/docs/pre-release/farming-&-staking/staking/intro/index.html index fd45be8aed0..05ec313523d 100644 --- a/ja/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/ja/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/staking/operators/index.html b/ja/docs/pre-release/farming-&-staking/staking/operators/index.html index 214deb7625f..501941c4ac7 100644 --- a/ja/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/ja/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/timekeeping/index.html b/ja/docs/pre-release/farming-&-staking/timekeeping/index.html index 681ef6a4af5..ba11bfe9b9a 100644 --- a/ja/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/ja/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/ja/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 7a4a37ce52a..0599341a52d 100644 --- a/ja/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/ja/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/ja/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index ddef34f2753..9ad568f99f1 100644 --- a/ja/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/ja/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/learn/intro/index.html b/ja/docs/pre-release/learn/intro/index.html index 34441f44b58..6923affcd49 100644 --- a/ja/docs/pre-release/learn/intro/index.html +++ b/ja/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/learn/security/index.html b/ja/docs/pre-release/learn/security/index.html index bedf184efc3..6db768950bf 100644 --- a/ja/docs/pre-release/learn/security/index.html +++ b/ja/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/learn/subnomicon/index.html b/ja/docs/pre-release/learn/subnomicon/index.html index dd9a3d9b6f9..1a6281ca1d5 100644 --- a/ja/docs/pre-release/learn/subnomicon/index.html +++ b/ja/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/ja/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 5988aa32929..5a5df52f463 100644 --- a/ja/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/ja/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/participate/contribute/index.html b/ja/docs/pre-release/participate/contribute/index.html index 3e2661d6015..12863c00894 100644 --- a/ja/docs/pre-release/participate/contribute/index.html +++ b/ja/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/ja/docs/pre-release/participate/index.html b/ja/docs/pre-release/participate/index.html index 844d936d1e1..ebea0740d00 100644 --- a/ja/docs/pre-release/participate/index.html +++ b/ja/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/ja/docs/pre-release/participate/translate/index.html b/ja/docs/pre-release/participate/translate/index.html index 646062e41be..d1fa546055c 100644 --- a/ja/docs/pre-release/participate/translate/index.html +++ b/ja/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/ja/index.html b/ja/index.html index 8c3b641f2de..3632aedcab9 100644 --- a/ja/index.html +++ b/ja/index.html @@ -7,13 +7,13 @@ - +

    どこからでも農場

    余分なディスクを誓約して農家ノードを実行することで報酬を獲得します。高価な設定や前払いの資本は必要ありません。

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/ja/markdown-page/index.html b/ja/markdown-page/index.html index e4211eb9402..96121f142b3 100644 --- a/ja/markdown-page/index.html +++ b/ja/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index 5e407fb291a..df2bd6b98b7 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/404.html b/pt/404.html index ca047c71cf4..25952381c37 100644 --- a/pt/404.html +++ b/pt/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/assets/js/9a83bd0e.59a14333.js b/pt/assets/js/9a83bd0e.59a14333.js new file mode 100644 index 00000000000..d8d49f37d0a --- /dev/null +++ b/pt/assets/js/9a83bd0e.59a14333.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8961],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1608:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/pt/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/pt/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/pt/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/pt/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/pt/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/pt/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/pt/assets/js/9a83bd0e.e83e0fcd.js b/pt/assets/js/9a83bd0e.e83e0fcd.js deleted file mode 100644 index 8caed90e3d2..00000000000 --- a/pt/assets/js/9a83bd0e.e83e0fcd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[8961],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1608:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/pt/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/pt/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/pt/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/pt/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/pt/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/pt/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/pt/assets/js/e60eb05b.5f45c5e2.js b/pt/assets/js/e60eb05b.5f45c5e2.js new file mode 100644 index 00000000000..b13ffd5210e --- /dev/null +++ b/pt/assets/js/e60eb05b.5f45c5e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2066],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1402:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/pt/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/pt/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/pt/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/pt/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/pt/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/pt/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/pt/assets/js/e60eb05b.fec4b907.js b/pt/assets/js/e60eb05b.fec4b907.js deleted file mode 100644 index a04193bfa9f..00000000000 --- a/pt/assets/js/e60eb05b.fec4b907.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2066],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1402:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/pt/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/pt/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/pt/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/pt/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/pt/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/pt/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/pt/assets/js/runtime~main.e52d3c69.js b/pt/assets/js/runtime~main.6965a0a8.js similarity index 98% rename from pt/assets/js/runtime~main.e52d3c69.js rename to pt/assets/js/runtime~main.6965a0a8.js index fb54423f066..ddcc2b5b8f5 100644 --- a/pt/assets/js/runtime~main.e52d3c69.js +++ b/pt/assets/js/runtime~main.6965a0a8.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",82:"a0e5e030",221:"21ec6533",378:"e71eaaf5",439:"5b425541",548:"24467d2c",616:"ae043bc8",716:"d2bb7ce9",1553:"e400c206",1563:"5a04c05e",1743:"e1c4b5ea",1831:"65b0d61c",1901:"3a820248",2066:"e60eb05b",2157:"2210dfa0",2200:"95bb7336",2402:"808249c2",2445:"f8ece6c6",2460:"061560f7",2897:"e21e9cc3",3005:"637d1e43",3020:"33c1bbc2",3059:"dd712a93",3085:"1f391b9e",3235:"da6f36cd",3237:"1df93b7f",3244:"fd081d97",3271:"9afbf091",3280:"ef42b41f",3347:"26262810",3537:"2b14f725",3632:"e8b906e1",3654:"fcf6a717",3809:"c5fc8fb8",3850:"8d85dac0",4049:"0d2aaab2",4152:"63b0746e",4182:"ffb4aaf9",4206:"0e41dfbd",4273:"591493c8",4527:"b6460d91",5016:"d5a09add",5077:"8e8980be",5116:"1e9391c9",5123:"6cce5a3f",5149:"cc8ec9c6",5151:"cb24d683",5210:"3880db7a",5504:"e52046d8",5580:"d3e61efc",5589:"e1e1d3f2",5716:"2494e53e",5896:"6b2a8630",6180:"afea807b",6405:"e59761b4",6414:"0fabc2a7",6649:"d5f7cd9c",6665:"62f18207",6729:"285721e5",7022:"095d206d",7051:"cd1791a2",7370:"c09f4ff7",7414:"393be207",7509:"784610e8",7594:"73364ba7",7649:"4b17c8b3",7690:"ecf9e1af",7803:"32a98c97",7814:"7c84b674",7844:"c315e93d",7904:"e4992b56",7918:"17896441",7922:"50ee8dee",7926:"dd69317a",8070:"e83dc2a6",8110:"da06b1d8",8127:"133c0b5f",8168:"9aa73d9e",8207:"2fb6f16b",8463:"7ee3975d",8566:"b3120f47",8637:"623420e1",8646:"da5d8f48",8851:"06de92cd",8877:"c0a7e76d",8961:"9a83bd0e",9066:"76f48613",9203:"46a074e5",9390:"335b11df",9392:"5b77d978",9445:"24fad61a",9514:"1be78505",9522:"2e84bd48",9817:"14eb3368",9831:"14bcfc90",9926:"93825ce7",9944:"130943a0",9977:"71968a76"}[e]||e)+"."+{53:"c410cfa6",82:"306cdce5",221:"debe4906",378:"e64a59b4",439:"3536f164",548:"9552a6bb",616:"5f0e7e7a",716:"ae0f98f7",814:"dc8c3a26",1553:"601209bf",1563:"ca12d0a1",1743:"693f0dfb",1831:"f3d0af33",1901:"02b25f70",2066:"fec4b907",2157:"6c24b5d5",2200:"d733b4e8",2402:"ff2d7fa6",2445:"3ee96920",2460:"9dd50c1e",2897:"9143f612",3005:"fc251931",3020:"974299fa",3059:"6004f949",3085:"3a447380",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3244:"b12c34c3",3271:"fd7c456e",3280:"a28d7ef7",3347:"5c8c3a00",3473:"fdffa07c",3537:"5d07fa8f",3632:"2ccd35a7",3654:"e9532ea7",3809:"52aea533",3850:"872f8c6e",4049:"b2f82a2b",4152:"ba5ee2dc",4182:"4b095837",4206:"0887409e",4273:"4991da91",4527:"23283900",4972:"4a54fd4a",5016:"7232bb62",5077:"2345c24c",5116:"df151813",5123:"617f44fd",5149:"56748190",5151:"7ae7e85d",5210:"90b70cc2",5504:"311f46f6",5580:"41f46289",5589:"91a359a5",5716:"0e6443b6",5896:"51947a5a",6180:"d4c960f6",6405:"c8850beb",6414:"f7574b54",6649:"92aeaa31",6665:"6b8da654",6729:"b829029a",7022:"eac36904",7051:"f22723cd",7370:"962c746f",7414:"18cec083",7509:"604f84f6",7594:"3136e40b",7649:"1a7bea02",7690:"ebb3e55c",7803:"df932f35",7814:"16835316",7844:"5da3dbe8",7904:"b83fe22a",7918:"e3da5265",7922:"45ac7bd3",7926:"6345f7bb",8070:"a1df8642",8110:"69c4d325",8127:"6f94f7b8",8168:"c18eaf23",8207:"8ba9a6cf",8463:"569df20e",8566:"4fa069a2",8637:"e7cfee41",8646:"ee52fadc",8851:"3d8be3c6",8877:"b59948be",8961:"e83e0fcd",9066:"a1a210fe",9203:"801d7247",9390:"4847db4a",9392:"bcbed1e1",9445:"85881287",9514:"478c02c6",9522:"17a5fee8",9817:"b7ea7ab7",9831:"9c3d5f6c",9926:"a2bdc91c",9944:"8f213c63",9977:"0431bfcc"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="portal:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/pt/",r.gca=function(e){return e={17896441:"7918",26262810:"3347","935f2afb":"53",a0e5e030:"82","21ec6533":"221",e71eaaf5:"378","5b425541":"439","24467d2c":"548",ae043bc8:"616",d2bb7ce9:"716",e400c206:"1553","5a04c05e":"1563",e1c4b5ea:"1743","65b0d61c":"1831","3a820248":"1901",e60eb05b:"2066","2210dfa0":"2157","95bb7336":"2200","808249c2":"2402",f8ece6c6:"2445","061560f7":"2460",e21e9cc3:"2897","637d1e43":"3005","33c1bbc2":"3020",dd712a93:"3059","1f391b9e":"3085",da6f36cd:"3235","1df93b7f":"3237",fd081d97:"3244","9afbf091":"3271",ef42b41f:"3280","2b14f725":"3537",e8b906e1:"3632",fcf6a717:"3654",c5fc8fb8:"3809","8d85dac0":"3850","0d2aaab2":"4049","63b0746e":"4152",ffb4aaf9:"4182","0e41dfbd":"4206","591493c8":"4273",b6460d91:"4527",d5a09add:"5016","8e8980be":"5077","1e9391c9":"5116","6cce5a3f":"5123",cc8ec9c6:"5149",cb24d683:"5151","3880db7a":"5210",e52046d8:"5504",d3e61efc:"5580",e1e1d3f2:"5589","2494e53e":"5716","6b2a8630":"5896",afea807b:"6180",e59761b4:"6405","0fabc2a7":"6414",d5f7cd9c:"6649","62f18207":"6665","285721e5":"6729","095d206d":"7022",cd1791a2:"7051",c09f4ff7:"7370","393be207":"7414","784610e8":"7509","73364ba7":"7594","4b17c8b3":"7649",ecf9e1af:"7690","32a98c97":"7803","7c84b674":"7814",c315e93d:"7844",e4992b56:"7904","50ee8dee":"7922",dd69317a:"7926",e83dc2a6:"8070",da06b1d8:"8110","133c0b5f":"8127","9aa73d9e":"8168","2fb6f16b":"8207","7ee3975d":"8463",b3120f47:"8566","623420e1":"8637",da5d8f48:"8646","06de92cd":"8851",c0a7e76d:"8877","9a83bd0e":"8961","76f48613":"9066","46a074e5":"9203","335b11df":"9390","5b77d978":"9392","24fad61a":"9445","1be78505":"9514","2e84bd48":"9522","14eb3368":"9817","14bcfc90":"9831","93825ce7":"9926","130943a0":"9944","71968a76":"9977"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",82:"a0e5e030",221:"21ec6533",378:"e71eaaf5",439:"5b425541",548:"24467d2c",616:"ae043bc8",716:"d2bb7ce9",1553:"e400c206",1563:"5a04c05e",1743:"e1c4b5ea",1831:"65b0d61c",1901:"3a820248",2066:"e60eb05b",2157:"2210dfa0",2200:"95bb7336",2402:"808249c2",2445:"f8ece6c6",2460:"061560f7",2897:"e21e9cc3",3005:"637d1e43",3020:"33c1bbc2",3059:"dd712a93",3085:"1f391b9e",3235:"da6f36cd",3237:"1df93b7f",3244:"fd081d97",3271:"9afbf091",3280:"ef42b41f",3347:"26262810",3537:"2b14f725",3632:"e8b906e1",3654:"fcf6a717",3809:"c5fc8fb8",3850:"8d85dac0",4049:"0d2aaab2",4152:"63b0746e",4182:"ffb4aaf9",4206:"0e41dfbd",4273:"591493c8",4527:"b6460d91",5016:"d5a09add",5077:"8e8980be",5116:"1e9391c9",5123:"6cce5a3f",5149:"cc8ec9c6",5151:"cb24d683",5210:"3880db7a",5504:"e52046d8",5580:"d3e61efc",5589:"e1e1d3f2",5716:"2494e53e",5896:"6b2a8630",6180:"afea807b",6405:"e59761b4",6414:"0fabc2a7",6649:"d5f7cd9c",6665:"62f18207",6729:"285721e5",7022:"095d206d",7051:"cd1791a2",7370:"c09f4ff7",7414:"393be207",7509:"784610e8",7594:"73364ba7",7649:"4b17c8b3",7690:"ecf9e1af",7803:"32a98c97",7814:"7c84b674",7844:"c315e93d",7904:"e4992b56",7918:"17896441",7922:"50ee8dee",7926:"dd69317a",8070:"e83dc2a6",8110:"da06b1d8",8127:"133c0b5f",8168:"9aa73d9e",8207:"2fb6f16b",8463:"7ee3975d",8566:"b3120f47",8637:"623420e1",8646:"da5d8f48",8851:"06de92cd",8877:"c0a7e76d",8961:"9a83bd0e",9066:"76f48613",9203:"46a074e5",9390:"335b11df",9392:"5b77d978",9445:"24fad61a",9514:"1be78505",9522:"2e84bd48",9817:"14eb3368",9831:"14bcfc90",9926:"93825ce7",9944:"130943a0",9977:"71968a76"}[e]||e)+"."+{53:"c410cfa6",82:"306cdce5",221:"debe4906",378:"e64a59b4",439:"3536f164",548:"9552a6bb",616:"5f0e7e7a",716:"ae0f98f7",814:"dc8c3a26",1553:"601209bf",1563:"ca12d0a1",1743:"693f0dfb",1831:"f3d0af33",1901:"02b25f70",2066:"5f45c5e2",2157:"6c24b5d5",2200:"d733b4e8",2402:"ff2d7fa6",2445:"3ee96920",2460:"9dd50c1e",2897:"9143f612",3005:"fc251931",3020:"974299fa",3059:"6004f949",3085:"3a447380",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3244:"b12c34c3",3271:"fd7c456e",3280:"a28d7ef7",3347:"5c8c3a00",3473:"fdffa07c",3537:"5d07fa8f",3632:"2ccd35a7",3654:"e9532ea7",3809:"52aea533",3850:"872f8c6e",4049:"b2f82a2b",4152:"ba5ee2dc",4182:"4b095837",4206:"0887409e",4273:"4991da91",4527:"23283900",4972:"4a54fd4a",5016:"7232bb62",5077:"2345c24c",5116:"df151813",5123:"617f44fd",5149:"56748190",5151:"7ae7e85d",5210:"90b70cc2",5504:"311f46f6",5580:"41f46289",5589:"91a359a5",5716:"0e6443b6",5896:"51947a5a",6180:"d4c960f6",6405:"c8850beb",6414:"f7574b54",6649:"92aeaa31",6665:"6b8da654",6729:"b829029a",7022:"eac36904",7051:"f22723cd",7370:"962c746f",7414:"18cec083",7509:"604f84f6",7594:"3136e40b",7649:"1a7bea02",7690:"ebb3e55c",7803:"df932f35",7814:"16835316",7844:"5da3dbe8",7904:"b83fe22a",7918:"e3da5265",7922:"45ac7bd3",7926:"6345f7bb",8070:"a1df8642",8110:"69c4d325",8127:"6f94f7b8",8168:"c18eaf23",8207:"8ba9a6cf",8463:"569df20e",8566:"4fa069a2",8637:"e7cfee41",8646:"ee52fadc",8851:"3d8be3c6",8877:"b59948be",8961:"59a14333",9066:"a1a210fe",9203:"801d7247",9390:"4847db4a",9392:"bcbed1e1",9445:"85881287",9514:"478c02c6",9522:"17a5fee8",9817:"b7ea7ab7",9831:"9c3d5f6c",9926:"a2bdc91c",9944:"8f213c63",9977:"0431bfcc"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="portal:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/pt/",r.gca=function(e){return e={17896441:"7918",26262810:"3347","935f2afb":"53",a0e5e030:"82","21ec6533":"221",e71eaaf5:"378","5b425541":"439","24467d2c":"548",ae043bc8:"616",d2bb7ce9:"716",e400c206:"1553","5a04c05e":"1563",e1c4b5ea:"1743","65b0d61c":"1831","3a820248":"1901",e60eb05b:"2066","2210dfa0":"2157","95bb7336":"2200","808249c2":"2402",f8ece6c6:"2445","061560f7":"2460",e21e9cc3:"2897","637d1e43":"3005","33c1bbc2":"3020",dd712a93:"3059","1f391b9e":"3085",da6f36cd:"3235","1df93b7f":"3237",fd081d97:"3244","9afbf091":"3271",ef42b41f:"3280","2b14f725":"3537",e8b906e1:"3632",fcf6a717:"3654",c5fc8fb8:"3809","8d85dac0":"3850","0d2aaab2":"4049","63b0746e":"4152",ffb4aaf9:"4182","0e41dfbd":"4206","591493c8":"4273",b6460d91:"4527",d5a09add:"5016","8e8980be":"5077","1e9391c9":"5116","6cce5a3f":"5123",cc8ec9c6:"5149",cb24d683:"5151","3880db7a":"5210",e52046d8:"5504",d3e61efc:"5580",e1e1d3f2:"5589","2494e53e":"5716","6b2a8630":"5896",afea807b:"6180",e59761b4:"6405","0fabc2a7":"6414",d5f7cd9c:"6649","62f18207":"6665","285721e5":"6729","095d206d":"7022",cd1791a2:"7051",c09f4ff7:"7370","393be207":"7414","784610e8":"7509","73364ba7":"7594","4b17c8b3":"7649",ecf9e1af:"7690","32a98c97":"7803","7c84b674":"7814",c315e93d:"7844",e4992b56:"7904","50ee8dee":"7922",dd69317a:"7926",e83dc2a6:"8070",da06b1d8:"8110","133c0b5f":"8127","9aa73d9e":"8168","2fb6f16b":"8207","7ee3975d":"8463",b3120f47:"8566","623420e1":"8637",da5d8f48:"8646","06de92cd":"8851",c0a7e76d:"8877","9a83bd0e":"8961","76f48613":"9066","46a074e5":"9203","335b11df":"9390","5b77d978":"9392","24fad61a":"9445","1be78505":"9514","2e84bd48":"9522","14eb3368":"9817","14bcfc90":"9831","93825ce7":"9926","130943a0":"9944","71968a76":"9977"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var c=new Promise(((f,c)=>d=e[a]=[f,c]));f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/pt/docs/category/advanced-cli/index.html b/pt/docs/category/advanced-cli/index.html index 508d57546c3..abf25c3793c 100644 --- a/pt/docs/category/advanced-cli/index.html +++ b/pt/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/category/develop-on-nova-evm-/index.html b/pt/docs/category/develop-on-nova-evm-/index.html index 34ee679a6cf..2c051854550 100644 --- a/pt/docs/category/develop-on-nova-evm-/index.html +++ b/pt/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/pt/docs/category/develop/index.html b/pt/docs/category/develop/index.html index c9b3eebe38d..3faab28370b 100644 --- a/pt/docs/category/develop/index.html +++ b/pt/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/category/farming/index.html b/pt/docs/category/farming/index.html index c2c9c34e9ea..b26e95d711e 100644 --- a/pt/docs/category/farming/index.html +++ b/pt/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/category/learn/index.html b/pt/docs/category/learn/index.html index 5b55e3cc75a..24f50dc07f6 100644 --- a/pt/docs/category/learn/index.html +++ b/pt/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/category/operators-and-nominators/index.html b/pt/docs/category/operators-and-nominators/index.html index 131a509302e..6b73ffc863e 100644 --- a/pt/docs/category/operators-and-nominators/index.html +++ b/pt/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/category/participate/index.html b/pt/docs/category/participate/index.html index 664a6371abc..99e8e95f5d2 100644 --- a/pt/docs/category/participate/index.html +++ b/pt/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/category/pulsar-recommended/index.html b/pt/docs/category/pulsar-recommended/index.html index 0328d86ecf5..f08e92eb99b 100644 --- a/pt/docs/category/pulsar-recommended/index.html +++ b/pt/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/category/wallets/index.html b/pt/docs/category/wallets/index.html index cf06fe3630a..f81e7a0827c 100644 --- a/pt/docs/category/wallets/index.html +++ b/pt/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/develop/nova/block_explorer/index.html b/pt/docs/develop/nova/block_explorer/index.html index 1fc0a6df74b..5a78d8a79c9 100644 --- a/pt/docs/develop/nova/block_explorer/index.html +++ b/pt/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/develop/nova/faucet/index.html b/pt/docs/develop/nova/faucet/index.html index b499501f5ae..df5f426af76 100644 --- a/pt/docs/develop/nova/faucet/index.html +++ b/pt/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/pt/docs/develop/nova/foundry_guide/index.html b/pt/docs/develop/nova/foundry_guide/index.html index 1916f6309ea..fa48b565c18 100644 --- a/pt/docs/develop/nova/foundry_guide/index.html +++ b/pt/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/pt/docs/develop/nova/general-information/index.html b/pt/docs/develop/nova/general-information/index.html index 49cbfd50c9d..8d7bc8a9ccd 100644 --- a/pt/docs/develop/nova/general-information/index.html +++ b/pt/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/pt/docs/develop/nova/hardhat_guide/index.html b/pt/docs/develop/nova/hardhat_guide/index.html index 73aa1de4f2d..67d9e7b201b 100644 --- a/pt/docs/develop/nova/hardhat_guide/index.html +++ b/pt/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/pt/docs/develop/nova/intro/index.html b/pt/docs/develop/nova/intro/index.html index 7461ba78ce6..2a4420e4ec8 100644 --- a/pt/docs/develop/nova/intro/index.html +++ b/pt/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/pt/docs/develop/nova/local_development/index.html b/pt/docs/develop/nova/local_development/index.html index 2106de1a3a1..0fe87c9d73f 100644 --- a/pt/docs/develop/nova/local_development/index.html +++ b/pt/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/pt/docs/develop/nova/quick_start/index.html b/pt/docs/develop/nova/quick_start/index.html index c3e489b731e..6d5e8964884 100644 --- a/pt/docs/develop/nova/quick_start/index.html +++ b/pt/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/pt/docs/develop/nova/remix_guide/index.html b/pt/docs/develop/nova/remix_guide/index.html index 3f0404842cf..80c8b82165d 100644 --- a/pt/docs/develop/nova/remix_guide/index.html +++ b/pt/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/pt/docs/develop/nova/setting-up-metamask/index.html b/pt/docs/develop/nova/setting-up-metamask/index.html index b4765b2e9b1..b50044eb1fe 100644 --- a/pt/docs/develop/nova/setting-up-metamask/index.html +++ b/pt/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/pt/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index ee62e7dd9cc..03850391fc8 100644 --- a/pt/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/pt/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/pt/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 76c98e1855f..3f5dbf78208 100644 --- a/pt/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/pt/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/pt/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index ffa28e0b6b7..9b6082fced1 100644 --- a/pt/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/pt/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/pt/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 1420cef4d67..aa31ea7746e 100644 --- a/pt/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/pt/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/pt/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 418d3fff3d2..bf6ab152452 100644 --- a/pt/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/pt/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/common_problems/index.html b/pt/docs/farming-&-staking/farming/common_problems/index.html index 9a3ab326205..aa0ebc9f833 100644 --- a/pt/docs/farming-&-staking/farming/common_problems/index.html +++ b/pt/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/pt/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 240b9009ea7..26fded2c325 100644 --- a/pt/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/pt/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/pt/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index e7ad05af17a..1760e355843 100644 --- a/pt/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/pt/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/pt/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 14feb7875dc..4c1a1164cd3 100644 --- a/pt/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/pt/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/pt/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index c2fa7a71fd0..65706b38b97 100644 --- a/pt/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/pt/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/index.html b/pt/docs/farming-&-staking/index.html index e0b897b38a6..3af1b69dd13 100644 --- a/pt/docs/farming-&-staking/index.html +++ b/pt/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/staking/index.html b/pt/docs/farming-&-staking/staking/index.html index b566aff9eda..85f52a1e94d 100644 --- a/pt/docs/farming-&-staking/staking/index.html +++ b/pt/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/staking/intro/index.html b/pt/docs/farming-&-staking/staking/intro/index.html index 4339a226ab8..a9a7db4beb9 100644 --- a/pt/docs/farming-&-staking/staking/intro/index.html +++ b/pt/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/staking/operators/index.html b/pt/docs/farming-&-staking/staking/operators/index.html index 3a689dad637..9733f1f448c 100644 --- a/pt/docs/farming-&-staking/staking/operators/index.html +++ b/pt/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/timekeeping/index.html b/pt/docs/farming-&-staking/timekeeping/index.html index 5fbdf28ec3c..7ce0999ea40 100644 --- a/pt/docs/farming-&-staking/timekeeping/index.html +++ b/pt/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/wallets/polkadot/index.html b/pt/docs/farming-&-staking/wallets/polkadot/index.html index 2f514d8fe87..437c4d9cc6b 100644 --- a/pt/docs/farming-&-staking/wallets/polkadot/index.html +++ b/pt/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/pt/docs/farming-&-staking/wallets/subwallet/index.html b/pt/docs/farming-&-staking/wallets/subwallet/index.html index 505cd390ca4..5896ec8aa17 100644 --- a/pt/docs/farming-&-staking/wallets/subwallet/index.html +++ b/pt/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/pt/docs/learn/intro/index.html b/pt/docs/learn/intro/index.html index f416b65dce7..74a5a9a6472 100644 --- a/pt/docs/learn/intro/index.html +++ b/pt/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/pt/docs/learn/security/index.html b/pt/docs/learn/security/index.html index 119cf59ed50..a178b7ae993 100644 --- a/pt/docs/learn/security/index.html +++ b/pt/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/pt/docs/learn/subnomicon/index.html b/pt/docs/learn/subnomicon/index.html index 1216e0ea04c..dcbbd32703d 100644 --- a/pt/docs/learn/subnomicon/index.html +++ b/pt/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/pt/docs/participate/CODE_OF_CONDUCT/index.html b/pt/docs/participate/CODE_OF_CONDUCT/index.html index d2df0a1763c..97bc41be2dc 100644 --- a/pt/docs/participate/CODE_OF_CONDUCT/index.html +++ b/pt/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/pt/docs/participate/contribute/index.html b/pt/docs/participate/contribute/index.html index af7f55494eb..cf6e005f000 100644 --- a/pt/docs/participate/contribute/index.html +++ b/pt/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/pt/docs/participate/index.html b/pt/docs/participate/index.html index 559cf3ba209..00b6fc11476 100644 --- a/pt/docs/participate/index.html +++ b/pt/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/pt/docs/participate/translate/index.html b/pt/docs/participate/translate/index.html index 2436b9a0442..bf338eaad16 100644 --- a/pt/docs/participate/translate/index.html +++ b/pt/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/additional-guides/index.html b/pt/docs/pre-release/category/additional-guides/index.html index 046d54f1c7d..ab345308659 100644 --- a/pt/docs/pre-release/category/additional-guides/index.html +++ b/pt/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/advanced-cli/index.html b/pt/docs/pre-release/category/advanced-cli/index.html index a0996bd8d4a..2a4209bd66e 100644 --- a/pt/docs/pre-release/category/advanced-cli/index.html +++ b/pt/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/develop-on-nova-evm-/index.html b/pt/docs/pre-release/category/develop-on-nova-evm-/index.html index 329e7ade851..c96ad5e1a42 100644 --- a/pt/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/pt/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/develop/index.html b/pt/docs/pre-release/category/develop/index.html index 0fc414744cc..fca3347da8a 100644 --- a/pt/docs/pre-release/category/develop/index.html +++ b/pt/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/farming/index.html b/pt/docs/pre-release/category/farming/index.html index 6e6280abad2..99c7cfcfdce 100644 --- a/pt/docs/pre-release/category/farming/index.html +++ b/pt/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/learn/index.html b/pt/docs/pre-release/category/learn/index.html index 6605f8c152b..1bfacca6209 100644 --- a/pt/docs/pre-release/category/learn/index.html +++ b/pt/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/operators-and-nominators/index.html b/pt/docs/pre-release/category/operators-and-nominators/index.html index d572972b1ad..d589f3767e1 100644 --- a/pt/docs/pre-release/category/operators-and-nominators/index.html +++ b/pt/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/participate/index.html b/pt/docs/pre-release/category/participate/index.html index 500a46764be..7a6d19ab68e 100644 --- a/pt/docs/pre-release/category/participate/index.html +++ b/pt/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/pulsar-recommended/index.html b/pt/docs/pre-release/category/pulsar-recommended/index.html index 6cdd630727e..0e5ae1883ee 100644 --- a/pt/docs/pre-release/category/pulsar-recommended/index.html +++ b/pt/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/category/wallets/index.html b/pt/docs/pre-release/category/wallets/index.html index a049117814b..6b385236855 100644 --- a/pt/docs/pre-release/category/wallets/index.html +++ b/pt/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/block_explorer/index.html b/pt/docs/pre-release/develop/nova/block_explorer/index.html index a8817fb6371..6d7cd9e69de 100644 --- a/pt/docs/pre-release/develop/nova/block_explorer/index.html +++ b/pt/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/faucet/index.html b/pt/docs/pre-release/develop/nova/faucet/index.html index 0b9d3bf6d9f..ff29053582a 100644 --- a/pt/docs/pre-release/develop/nova/faucet/index.html +++ b/pt/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/foundry_guide/index.html b/pt/docs/pre-release/develop/nova/foundry_guide/index.html index d6572ca6b11..7fbb6e480df 100644 --- a/pt/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/pt/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/general-information/index.html b/pt/docs/pre-release/develop/nova/general-information/index.html index cc5dcdaca28..6eb7dbf9d2b 100644 --- a/pt/docs/pre-release/develop/nova/general-information/index.html +++ b/pt/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/hardhat_guide/index.html b/pt/docs/pre-release/develop/nova/hardhat_guide/index.html index 80ca804c65c..91e9e189f38 100644 --- a/pt/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/pt/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/intro/index.html b/pt/docs/pre-release/develop/nova/intro/index.html index cde6b2620b6..944bb32b76a 100644 --- a/pt/docs/pre-release/develop/nova/intro/index.html +++ b/pt/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/local_development/index.html b/pt/docs/pre-release/develop/nova/local_development/index.html index 81b2ac178e9..5a69afc30f1 100644 --- a/pt/docs/pre-release/develop/nova/local_development/index.html +++ b/pt/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/quick_start/index.html b/pt/docs/pre-release/develop/nova/quick_start/index.html index 2b519509ab7..b301c369752 100644 --- a/pt/docs/pre-release/develop/nova/quick_start/index.html +++ b/pt/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/remix_guide/index.html b/pt/docs/pre-release/develop/nova/remix_guide/index.html index 6f76c1f7cbc..fb489be977b 100644 --- a/pt/docs/pre-release/develop/nova/remix_guide/index.html +++ b/pt/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/develop/nova/setting-up-metamask/index.html b/pt/docs/pre-release/develop/nova/setting-up-metamask/index.html index e30a11a93e3..1677e4bba7b 100644 --- a/pt/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/pt/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/pt/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index a85599286c7..db511e2756c 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index ace3af293c0..36575078b4a 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index a2aee973cd8..885aef73d48 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 925abc84733..6324d400062 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 91020ebdf47..7a38e261850 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/pt/docs/pre-release/farming-&-staking/farming/common_problems/index.html index f4569494567..0f3ff9dfcc0 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index e7086ebc15c..b42958c968a 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 892146e1b82..7ecb26c3732 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 9a638d31eb6..ddc8e15f85d 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index e30196e53c2..0b83b673199 100644 --- a/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/pt/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/index.html b/pt/docs/pre-release/farming-&-staking/index.html index da11279ad26..3428b585779 100644 --- a/pt/docs/pre-release/farming-&-staking/index.html +++ b/pt/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/staking/index.html b/pt/docs/pre-release/farming-&-staking/staking/index.html index bebccc53a46..abefeac56fd 100644 --- a/pt/docs/pre-release/farming-&-staking/staking/index.html +++ b/pt/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/staking/intro/index.html b/pt/docs/pre-release/farming-&-staking/staking/intro/index.html index 4522eb03e4e..5b3a8084ba7 100644 --- a/pt/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/pt/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/staking/operators/index.html b/pt/docs/pre-release/farming-&-staking/staking/operators/index.html index b144ec098d2..9bacb481390 100644 --- a/pt/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/pt/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/timekeeping/index.html b/pt/docs/pre-release/farming-&-staking/timekeeping/index.html index a2b506bdeff..57268de54bf 100644 --- a/pt/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/pt/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/pt/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 7e476e7fa0a..fba89b5652b 100644 --- a/pt/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/pt/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/pt/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index 2c658e04e8a..5034def9446 100644 --- a/pt/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/pt/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/learn/intro/index.html b/pt/docs/pre-release/learn/intro/index.html index 203ea138525..424f24c14de 100644 --- a/pt/docs/pre-release/learn/intro/index.html +++ b/pt/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/learn/security/index.html b/pt/docs/pre-release/learn/security/index.html index daff869adf8..755ab9143a0 100644 --- a/pt/docs/pre-release/learn/security/index.html +++ b/pt/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/learn/subnomicon/index.html b/pt/docs/pre-release/learn/subnomicon/index.html index 47596a6aff2..3f83e8835e8 100644 --- a/pt/docs/pre-release/learn/subnomicon/index.html +++ b/pt/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/pt/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 8bd90a880be..da611de26ad 100644 --- a/pt/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/pt/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/participate/contribute/index.html b/pt/docs/pre-release/participate/contribute/index.html index c5f824232cd..f05d84ffc63 100644 --- a/pt/docs/pre-release/participate/contribute/index.html +++ b/pt/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/pt/docs/pre-release/participate/index.html b/pt/docs/pre-release/participate/index.html index 0effe750ea2..09eacf87dd7 100644 --- a/pt/docs/pre-release/participate/index.html +++ b/pt/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/pt/docs/pre-release/participate/translate/index.html b/pt/docs/pre-release/participate/translate/index.html index a07aad0ba33..94600a69292 100644 --- a/pt/docs/pre-release/participate/translate/index.html +++ b/pt/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/pt/index.html b/pt/index.html index 5d971591df3..b716b26d5f7 100644 --- a/pt/index.html +++ b/pt/index.html @@ -7,13 +7,13 @@ - +

    Fazenda de Qualquer Lugar

    Ganhe recompensas executando um nó de agricultor, comprometendo um disco sobressalente. Não é necessária configuração cara ou capital antecipado.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/pt/markdown-page/index.html b/pt/markdown-page/index.html index 89f5a4be4e5..5dbad99b31e 100644 --- a/pt/markdown-page/index.html +++ b/pt/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ru/404.html b/ru/404.html index 19729e81e81..b773d5c16d1 100644 --- a/ru/404.html +++ b/ru/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ru/assets/js/37e31bb5.02b94e77.js b/ru/assets/js/37e31bb5.02b94e77.js new file mode 100644 index 00000000000..e8a9ae36c10 --- /dev/null +++ b/ru/assets/js/37e31bb5.02b94e77.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5002],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1073:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ru/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ru/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ru/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ru/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ru/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ru/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ru/assets/js/37e31bb5.4e5c25a7.js b/ru/assets/js/37e31bb5.4e5c25a7.js deleted file mode 100644 index 9402cc7c980..00000000000 --- a/ru/assets/js/37e31bb5.4e5c25a7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5002],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1073:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ru/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ru/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ru/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ru/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ru/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ru/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ru/assets/js/f9786db7.045f5c94.js b/ru/assets/js/f9786db7.045f5c94.js deleted file mode 100644 index c7c555e4140..00000000000 --- a/ru/assets/js/f9786db7.045f5c94.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2491],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5278:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ru/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ru/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ru/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ru/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ru/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ru/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ru/assets/js/f9786db7.184eb8cb.js b/ru/assets/js/f9786db7.184eb8cb.js new file mode 100644 index 00000000000..07e87f4bd33 --- /dev/null +++ b/ru/assets/js/f9786db7.184eb8cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[2491],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5278:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/ru/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/ru/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/ru/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/ru/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/ru/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/ru/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/ru/assets/js/runtime~main.50ab7de9.js b/ru/assets/js/runtime~main.d1bfc678.js similarity index 98% rename from ru/assets/js/runtime~main.50ab7de9.js rename to ru/assets/js/runtime~main.d1bfc678.js index 36f6db2e97e..b981bfc90f8 100644 --- a/ru/assets/js/runtime~main.50ab7de9.js +++ b/ru/assets/js/runtime~main.d1bfc678.js @@ -1 +1 @@ -(()=>{"use strict";var e,f,a,d,c,b={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var a=t[e]={exports:{}};return b[e].call(a.exports,a,a.exports,r),a.exports}r.m=b,e=[],r.O=(f,a,d,c)=>{if(!a){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[a,d,c]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};f=f||[null,a({}),a([]),a(a)];for(var t=2&d&&e;"object"==typeof t&&!~f.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((f=>b[f]=()=>e[f]));return b.default=()=>e,r.d(c,b),c},r.d=(e,f)=>{for(var a in f)r.o(f,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,a)=>(r.f[a](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",357:"5169ebcc",445:"306206cb",741:"0ed7d120",874:"eaff6b9c",1050:"46617758",1122:"52f05db5",1305:"3d80116e",1384:"f1f7360e",1428:"4b573b3a",1513:"05f1f583",1653:"c4a088a9",1684:"c9d26ebe",1875:"2a14153a",2303:"f6c3cdf7",2352:"5d4c548a",2491:"f9786db7",2530:"16957804",2570:"f7d19683",3027:"8a1afe01",3029:"ed5627a3",3085:"1f391b9e",3094:"9d755f68",3235:"da6f36cd",3237:"1df93b7f",3275:"b8760b12",3280:"ef42b41f",3282:"3b1cf26b",3402:"871a47a1",3447:"9e9cd801",3503:"f99597e5",3511:"428337cb",3558:"59a1277e",3633:"79255e39",3636:"8745d56d",3850:"6d17b76a",3925:"6919a314",3970:"1654c305",4237:"1412fdcb",4340:"7b0b96c7",4440:"e591f0d2",4463:"025fcf45",4523:"ca2fae09",4561:"731b408c",4608:"7a8be715",4681:"696181fa",4706:"75fddfde",4719:"ce439e53",4845:"2042b144",4952:"fecd7086",4999:"26f2c332",5002:"37e31bb5",5009:"81f51ba1",5042:"cd121da0",5436:"925bae4f",5605:"546d01bf",5695:"adfd58f8",5754:"732050b7",5873:"2fc8ae7d",5909:"5a937d21",6061:"88818011",6153:"8b7df597",6184:"ce696289",6191:"823eeb4a",6192:"2d3f6a1f",6392:"1badea06",6554:"8fca715f",6567:"d7ed4069",6778:"a6462692",6898:"7d5a26b2",7036:"aca24d8a",7142:"c7c3d224",7144:"d9397546",7213:"263a20f3",7370:"c09f4ff7",7371:"3fdb505e",7414:"393be207",7488:"c70bea9c",7720:"5e15f349",7918:"17896441",8078:"4458a2cc",8096:"07115285",8100:"cb4d58f5",8305:"c2778c3e",8421:"5957db6e",8451:"aeeba7b2",8545:"77b00bae",8549:"2f120c82",9019:"d9090d1a",9314:"4a286b10",9451:"dceaaa31",9514:"1be78505",9526:"9fab7691",9601:"cfdf5a8d",9716:"2388de53",9817:"14eb3368",9865:"6fb332a7",9960:"115c1ca5"}[e]||e)+"."+{53:"694b38c8",357:"d9978bd6",445:"e66ecf8f",741:"68b87a46",814:"dc8c3a26",874:"a2748420",1050:"eaad3450",1122:"82d81a84",1305:"8377455d",1384:"cf75d6c3",1428:"8fb5d861",1513:"b368b47f",1653:"8327d17a",1684:"1d91ee8c",1875:"d76f2728",2303:"9fec0d6d",2352:"7db52153",2491:"045f5c94",2530:"8acc54d0",2570:"d2cf01c3",3027:"0b6486a1",3029:"071df98e",3085:"3a447380",3094:"ed77dc16",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3275:"9ca3948c",3280:"a28d7ef7",3282:"91d1b89e",3402:"426dd0c0",3447:"fe4b89db",3473:"fdffa07c",3503:"fffa1145",3511:"753af8a3",3558:"62acba0f",3633:"a0f4d69a",3636:"2abf66c6",3850:"3b761b52",3925:"0da1dc30",3970:"3d5d24e6",4237:"963cafe3",4340:"48080330",4440:"f626854a",4463:"d9ae353a",4523:"3f0c2f88",4561:"ac6f9a58",4608:"3cdd3e63",4681:"586465fc",4706:"526f908b",4719:"c131e302",4845:"2707e2ea",4952:"ebd6528f",4972:"4a54fd4a",4999:"87aa8b4e",5002:"4e5c25a7",5009:"6f61e8a2",5042:"eee71eed",5436:"73739c52",5605:"88d5a65e",5695:"5d105767",5754:"e63cd694",5873:"2c729440",5909:"7a97e276",6061:"dcd26d67",6153:"559366a1",6184:"d98933a4",6191:"aec56ac5",6192:"43b7d92e",6392:"d0c48b13",6554:"6ae703e6",6567:"d30961be",6778:"74461aba",6898:"2d52e28c",7036:"24d465c1",7142:"58aa1077",7144:"ba11ea44",7213:"220446de",7370:"d7e7d919",7371:"dc4231fa",7414:"9035c9f0",7488:"f53a64fd",7720:"727a14c0",7918:"e3da5265",8078:"e74d2c0a",8096:"06e106f5",8100:"6e5c4673",8305:"478dc11b",8421:"05365008",8451:"1119b8de",8545:"e0f4c574",8549:"6ddeba47",9019:"0e0a0f8c",9314:"04d9e975",9451:"8f0a0e52",9514:"478c02c6",9526:"4a3535d4",9601:"e0ef84a7",9716:"c3f28e05",9817:"b7ea7ab7",9865:"95c77161",9960:"04e2c80d"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),d={},c="portal:",r.l=(e,f,a,b)=>{if(d[e])d[e].push(f);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(a))),f)return f(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/ru/",r.gca=function(e){return e={16957804:"2530",17896441:"7918",46617758:"1050",88818011:"6061","935f2afb":"53","5169ebcc":"357","306206cb":"445","0ed7d120":"741",eaff6b9c:"874","52f05db5":"1122","3d80116e":"1305",f1f7360e:"1384","4b573b3a":"1428","05f1f583":"1513",c4a088a9:"1653",c9d26ebe:"1684","2a14153a":"1875",f6c3cdf7:"2303","5d4c548a":"2352",f9786db7:"2491",f7d19683:"2570","8a1afe01":"3027",ed5627a3:"3029","1f391b9e":"3085","9d755f68":"3094",da6f36cd:"3235","1df93b7f":"3237",b8760b12:"3275",ef42b41f:"3280","3b1cf26b":"3282","871a47a1":"3402","9e9cd801":"3447",f99597e5:"3503","428337cb":"3511","59a1277e":"3558","79255e39":"3633","8745d56d":"3636","6d17b76a":"3850","6919a314":"3925","1654c305":"3970","1412fdcb":"4237","7b0b96c7":"4340",e591f0d2:"4440","025fcf45":"4463",ca2fae09:"4523","731b408c":"4561","7a8be715":"4608","696181fa":"4681","75fddfde":"4706",ce439e53:"4719","2042b144":"4845",fecd7086:"4952","26f2c332":"4999","37e31bb5":"5002","81f51ba1":"5009",cd121da0:"5042","925bae4f":"5436","546d01bf":"5605",adfd58f8:"5695","732050b7":"5754","2fc8ae7d":"5873","5a937d21":"5909","8b7df597":"6153",ce696289:"6184","823eeb4a":"6191","2d3f6a1f":"6192","1badea06":"6392","8fca715f":"6554",d7ed4069:"6567",a6462692:"6778","7d5a26b2":"6898",aca24d8a:"7036",c7c3d224:"7142",d9397546:"7144","263a20f3":"7213",c09f4ff7:"7370","3fdb505e":"7371","393be207":"7414",c70bea9c:"7488","5e15f349":"7720","4458a2cc":"8078","07115285":"8096",cb4d58f5:"8100",c2778c3e:"8305","5957db6e":"8421",aeeba7b2:"8451","77b00bae":"8545","2f120c82":"8549",d9090d1a:"9019","4a286b10":"9314",dceaaa31:"9451","1be78505":"9514","9fab7691":"9526",cfdf5a8d:"9601","2388de53":"9716","14eb3368":"9817","6fb332a7":"9865","115c1ca5":"9960"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,a)=>{var d=r.o(e,f)?e[f]:void 0;if(0!==d)if(d)a.push(d[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var c=new Promise(((a,c)=>d=e[f]=[a,c]));a.push(d[2]=c);var b=r.p+r.u(f),t=new Error;r.l(b,(a=>{if(r.o(e,f)&&(0!==(d=e[f])&&(e[f]=void 0),d)){var c=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+f+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,a)=>{var d,c,b=a[0],t=a[1],o=a[2],n=0;if(b.some((f=>0!==e[f]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(f&&f(a);n{"use strict";var e,f,a,d,c,b={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var a=t[e]={exports:{}};return b[e].call(a.exports,a,a.exports,r),a.exports}r.m=b,e=[],r.O=(f,a,d,c)=>{if(!a){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[a,d,c]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};f=f||[null,a({}),a([]),a(a)];for(var t=2&d&&e;"object"==typeof t&&!~f.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((f=>b[f]=()=>e[f]));return b.default=()=>e,r.d(c,b),c},r.d=(e,f)=>{for(var a in f)r.o(f,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,a)=>(r.f[a](e,f),f)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",357:"5169ebcc",445:"306206cb",741:"0ed7d120",874:"eaff6b9c",1050:"46617758",1122:"52f05db5",1305:"3d80116e",1384:"f1f7360e",1428:"4b573b3a",1513:"05f1f583",1653:"c4a088a9",1684:"c9d26ebe",1875:"2a14153a",2303:"f6c3cdf7",2352:"5d4c548a",2491:"f9786db7",2530:"16957804",2570:"f7d19683",3027:"8a1afe01",3029:"ed5627a3",3085:"1f391b9e",3094:"9d755f68",3235:"da6f36cd",3237:"1df93b7f",3275:"b8760b12",3280:"ef42b41f",3282:"3b1cf26b",3402:"871a47a1",3447:"9e9cd801",3503:"f99597e5",3511:"428337cb",3558:"59a1277e",3633:"79255e39",3636:"8745d56d",3850:"6d17b76a",3925:"6919a314",3970:"1654c305",4237:"1412fdcb",4340:"7b0b96c7",4440:"e591f0d2",4463:"025fcf45",4523:"ca2fae09",4561:"731b408c",4608:"7a8be715",4681:"696181fa",4706:"75fddfde",4719:"ce439e53",4845:"2042b144",4952:"fecd7086",4999:"26f2c332",5002:"37e31bb5",5009:"81f51ba1",5042:"cd121da0",5436:"925bae4f",5605:"546d01bf",5695:"adfd58f8",5754:"732050b7",5873:"2fc8ae7d",5909:"5a937d21",6061:"88818011",6153:"8b7df597",6184:"ce696289",6191:"823eeb4a",6192:"2d3f6a1f",6392:"1badea06",6554:"8fca715f",6567:"d7ed4069",6778:"a6462692",6898:"7d5a26b2",7036:"aca24d8a",7142:"c7c3d224",7144:"d9397546",7213:"263a20f3",7370:"c09f4ff7",7371:"3fdb505e",7414:"393be207",7488:"c70bea9c",7720:"5e15f349",7918:"17896441",8078:"4458a2cc",8096:"07115285",8100:"cb4d58f5",8305:"c2778c3e",8421:"5957db6e",8451:"aeeba7b2",8545:"77b00bae",8549:"2f120c82",9019:"d9090d1a",9314:"4a286b10",9451:"dceaaa31",9514:"1be78505",9526:"9fab7691",9601:"cfdf5a8d",9716:"2388de53",9817:"14eb3368",9865:"6fb332a7",9960:"115c1ca5"}[e]||e)+"."+{53:"694b38c8",357:"d9978bd6",445:"e66ecf8f",741:"68b87a46",814:"dc8c3a26",874:"a2748420",1050:"eaad3450",1122:"82d81a84",1305:"8377455d",1384:"cf75d6c3",1428:"8fb5d861",1513:"b368b47f",1653:"8327d17a",1684:"1d91ee8c",1875:"d76f2728",2303:"9fec0d6d",2352:"7db52153",2491:"184eb8cb",2530:"8acc54d0",2570:"d2cf01c3",3027:"0b6486a1",3029:"071df98e",3085:"3a447380",3094:"ed77dc16",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3275:"9ca3948c",3280:"a28d7ef7",3282:"91d1b89e",3402:"426dd0c0",3447:"fe4b89db",3473:"fdffa07c",3503:"fffa1145",3511:"753af8a3",3558:"62acba0f",3633:"a0f4d69a",3636:"2abf66c6",3850:"3b761b52",3925:"0da1dc30",3970:"3d5d24e6",4237:"963cafe3",4340:"48080330",4440:"f626854a",4463:"d9ae353a",4523:"3f0c2f88",4561:"ac6f9a58",4608:"3cdd3e63",4681:"586465fc",4706:"526f908b",4719:"c131e302",4845:"2707e2ea",4952:"ebd6528f",4972:"4a54fd4a",4999:"87aa8b4e",5002:"02b94e77",5009:"6f61e8a2",5042:"eee71eed",5436:"73739c52",5605:"88d5a65e",5695:"5d105767",5754:"e63cd694",5873:"2c729440",5909:"7a97e276",6061:"dcd26d67",6153:"559366a1",6184:"d98933a4",6191:"aec56ac5",6192:"43b7d92e",6392:"d0c48b13",6554:"6ae703e6",6567:"d30961be",6778:"74461aba",6898:"2d52e28c",7036:"24d465c1",7142:"58aa1077",7144:"ba11ea44",7213:"220446de",7370:"d7e7d919",7371:"dc4231fa",7414:"9035c9f0",7488:"f53a64fd",7720:"727a14c0",7918:"e3da5265",8078:"e74d2c0a",8096:"06e106f5",8100:"6e5c4673",8305:"478dc11b",8421:"05365008",8451:"1119b8de",8545:"e0f4c574",8549:"6ddeba47",9019:"0e0a0f8c",9314:"04d9e975",9451:"8f0a0e52",9514:"478c02c6",9526:"4a3535d4",9601:"e0ef84a7",9716:"c3f28e05",9817:"b7ea7ab7",9865:"95c77161",9960:"04e2c80d"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),d={},c="portal:",r.l=(e,f,a,b)=>{if(d[e])d[e].push(f);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(a))),f)return f(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/ru/",r.gca=function(e){return e={16957804:"2530",17896441:"7918",46617758:"1050",88818011:"6061","935f2afb":"53","5169ebcc":"357","306206cb":"445","0ed7d120":"741",eaff6b9c:"874","52f05db5":"1122","3d80116e":"1305",f1f7360e:"1384","4b573b3a":"1428","05f1f583":"1513",c4a088a9:"1653",c9d26ebe:"1684","2a14153a":"1875",f6c3cdf7:"2303","5d4c548a":"2352",f9786db7:"2491",f7d19683:"2570","8a1afe01":"3027",ed5627a3:"3029","1f391b9e":"3085","9d755f68":"3094",da6f36cd:"3235","1df93b7f":"3237",b8760b12:"3275",ef42b41f:"3280","3b1cf26b":"3282","871a47a1":"3402","9e9cd801":"3447",f99597e5:"3503","428337cb":"3511","59a1277e":"3558","79255e39":"3633","8745d56d":"3636","6d17b76a":"3850","6919a314":"3925","1654c305":"3970","1412fdcb":"4237","7b0b96c7":"4340",e591f0d2:"4440","025fcf45":"4463",ca2fae09:"4523","731b408c":"4561","7a8be715":"4608","696181fa":"4681","75fddfde":"4706",ce439e53:"4719","2042b144":"4845",fecd7086:"4952","26f2c332":"4999","37e31bb5":"5002","81f51ba1":"5009",cd121da0:"5042","925bae4f":"5436","546d01bf":"5605",adfd58f8:"5695","732050b7":"5754","2fc8ae7d":"5873","5a937d21":"5909","8b7df597":"6153",ce696289:"6184","823eeb4a":"6191","2d3f6a1f":"6192","1badea06":"6392","8fca715f":"6554",d7ed4069:"6567",a6462692:"6778","7d5a26b2":"6898",aca24d8a:"7036",c7c3d224:"7142",d9397546:"7144","263a20f3":"7213",c09f4ff7:"7370","3fdb505e":"7371","393be207":"7414",c70bea9c:"7488","5e15f349":"7720","4458a2cc":"8078","07115285":"8096",cb4d58f5:"8100",c2778c3e:"8305","5957db6e":"8421",aeeba7b2:"8451","77b00bae":"8545","2f120c82":"8549",d9090d1a:"9019","4a286b10":"9314",dceaaa31:"9451","1be78505":"9514","9fab7691":"9526",cfdf5a8d:"9601","2388de53":"9716","14eb3368":"9817","6fb332a7":"9865","115c1ca5":"9960"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,a)=>{var d=r.o(e,f)?e[f]:void 0;if(0!==d)if(d)a.push(d[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var c=new Promise(((a,c)=>d=e[f]=[a,c]));a.push(d[2]=c);var b=r.p+r.u(f),t=new Error;r.l(b,(a=>{if(r.o(e,f)&&(0!==(d=e[f])&&(e[f]=void 0),d)){var c=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+f+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,a)=>{var d,c,b=a[0],t=a[1],o=a[2],n=0;if(b.some((f=>0!==e[f]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(f&&f(a);n - + - + \ No newline at end of file diff --git a/ru/docs/category/advanced-cli/index.html b/ru/docs/category/advanced-cli/index.html index 52c8ff027ec..2dc49113346 100644 --- a/ru/docs/category/advanced-cli/index.html +++ b/ru/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/category/develop-on-nova-evm-/index.html b/ru/docs/category/develop-on-nova-evm-/index.html index e9696e9a465..2ff8326dc08 100644 --- a/ru/docs/category/develop-on-nova-evm-/index.html +++ b/ru/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/category/develop/index.html b/ru/docs/category/develop/index.html index 720898dbe38..d5366d73690 100644 --- a/ru/docs/category/develop/index.html +++ b/ru/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ru/docs/category/farming/index.html b/ru/docs/category/farming/index.html index 8a7ebf3464d..95d2c1e12d3 100644 --- a/ru/docs/category/farming/index.html +++ b/ru/docs/category/farming/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/category/learn/index.html b/ru/docs/category/learn/index.html index 011cd59127d..5961d14b504 100644 --- a/ru/docs/category/learn/index.html +++ b/ru/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ru/docs/category/operators-and-nominators/index.html b/ru/docs/category/operators-and-nominators/index.html index f231bb8a8f3..0c56ff96ecf 100644 --- a/ru/docs/category/operators-and-nominators/index.html +++ b/ru/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ru/docs/category/participate/index.html b/ru/docs/category/participate/index.html index b898b89044e..969c4c69940 100644 --- a/ru/docs/category/participate/index.html +++ b/ru/docs/category/participate/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/category/pulsar-recommended/index.html b/ru/docs/category/pulsar-recommended/index.html index c2289c615cf..71801594010 100644 --- a/ru/docs/category/pulsar-recommended/index.html +++ b/ru/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/category/wallets/index.html b/ru/docs/category/wallets/index.html index 688f66936db..3466a181592 100644 --- a/ru/docs/category/wallets/index.html +++ b/ru/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/block_explorer/index.html b/ru/docs/develop/nova/block_explorer/index.html index 649622cec4e..497c8f6b03b 100644 --- a/ru/docs/develop/nova/block_explorer/index.html +++ b/ru/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/faucet/index.html b/ru/docs/develop/nova/faucet/index.html index 595356c0d57..88eee0e903f 100644 --- a/ru/docs/develop/nova/faucet/index.html +++ b/ru/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/ru/docs/develop/nova/foundry_guide/index.html b/ru/docs/develop/nova/foundry_guide/index.html index 97d6f82c796..75d443c5be1 100644 --- a/ru/docs/develop/nova/foundry_guide/index.html +++ b/ru/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/ru/docs/develop/nova/general-information/index.html b/ru/docs/develop/nova/general-information/index.html index 97de392e16d..2ed9dc30103 100644 --- a/ru/docs/develop/nova/general-information/index.html +++ b/ru/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Версия: последние

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/hardhat_guide/index.html b/ru/docs/develop/nova/hardhat_guide/index.html index ae7017b1ccc..370f54938f7 100644 --- a/ru/docs/develop/nova/hardhat_guide/index.html +++ b/ru/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/intro/index.html b/ru/docs/develop/nova/intro/index.html index c153aa44f5e..5c663878468 100644 --- a/ru/docs/develop/nova/intro/index.html +++ b/ru/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/local_development/index.html b/ru/docs/develop/nova/local_development/index.html index 0ebe9cccc18..ae9c028d3fc 100644 --- a/ru/docs/develop/nova/local_development/index.html +++ b/ru/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Версия: последние

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/quick_start/index.html b/ru/docs/develop/nova/quick_start/index.html index ae4a7cf1ded..ac896819b5e 100644 --- a/ru/docs/develop/nova/quick_start/index.html +++ b/ru/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Версия: последние

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/remix_guide/index.html b/ru/docs/develop/nova/remix_guide/index.html index 0615348fa01..05c0a851d78 100644 --- a/ru/docs/develop/nova/remix_guide/index.html +++ b/ru/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/ru/docs/develop/nova/setting-up-metamask/index.html b/ru/docs/develop/nova/setting-up-metamask/index.html index 5a964a41bc2..6b115312111 100644 --- a/ru/docs/develop/nova/setting-up-metamask/index.html +++ b/ru/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      инфо

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/ru/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index e3251556371..b2d85537a05 100644 --- a/ru/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/ru/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/ru/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 1961e10d1d3..3020a4df473 100644 --- a/ru/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/ru/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/ru/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index d76ea2e6d6e..f8f9054ceec 100644 --- a/ru/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/ru/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Версия: последние

    Требования

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareХарактеристики
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/ru/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 225373f1ced..1270def25bc 100644 --- a/ru/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/ru/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Версия: последние

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    инфо

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/ru/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index e72e046338a..183ecf97ede 100644 --- a/ru/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/ru/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Версия: последние

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    инфо

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/common_problems/index.html b/ru/docs/farming-&-staking/farming/common_problems/index.html index 0ce9762bf1d..86ce72b76d3 100644 --- a/ru/docs/farming-&-staking/farming/common_problems/index.html +++ b/ru/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/ru/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 439b89fa176..0e78ae8aa88 100644 --- a/ru/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/ru/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    опасность

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/ru/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 015d5b1f82e..f72693f1468 100644 --- a/ru/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/ru/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Версия: последние

    Требования

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareХарактеристики
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/ru/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 26bc4b44b3f..f171fe8e447 100644 --- a/ru/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/ru/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/ru/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 8a08a17c483..deeb7851839 100644 --- a/ru/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/ru/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    инфо

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/index.html b/ru/docs/farming-&-staking/index.html index a1ef6886523..b2408c41bb8 100644 --- a/ru/docs/farming-&-staking/index.html +++ b/ru/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/staking/index.html b/ru/docs/farming-&-staking/staking/index.html index 301f90a9f30..98fe6accd15 100644 --- a/ru/docs/farming-&-staking/staking/index.html +++ b/ru/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/staking/intro/index.html b/ru/docs/farming-&-staking/staking/intro/index.html index ba4ea4d5e7e..2cedaa10572 100644 --- a/ru/docs/farming-&-staking/staking/intro/index.html +++ b/ru/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/staking/operators/index.html b/ru/docs/farming-&-staking/staking/operators/index.html index f56d6ad5ac6..25f2549322c 100644 --- a/ru/docs/farming-&-staking/staking/operators/index.html +++ b/ru/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    инфо

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    инфо

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    инфо

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    инфо

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    инфо

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/timekeeping/index.html b/ru/docs/farming-&-staking/timekeeping/index.html index c5de7a3bf1a..ccc1aad79cf 100644 --- a/ru/docs/farming-&-staking/timekeeping/index.html +++ b/ru/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareХарактеристики
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/wallets/polkadot/index.html b/ru/docs/farming-&-staking/wallets/polkadot/index.html index e5bc597d45e..fb6e7f3e29c 100644 --- a/ru/docs/farming-&-staking/wallets/polkadot/index.html +++ b/ru/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    Это самый простой кошелек. Это связано с тем, что он является базовым кошельком Substrate, поддерживающим все сети на основе Substrate. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Polkadot.js - это Substrate/EVM-кошелек, от создателей Substrate и Polkadota/Kusama, а именно, от команды Parity.

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. После этого расширение покажет вам вашу мнемоническую комбинацию из 12 слов.

    опасность

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. После того как вы сохраните вашу мнемоническую фразу, установите флажок "Я надежно сохранил свою мнемоническую фразу" и нажмите кнопку "Следующий шаг".

    2. The next step will ask for a Name & Password for the wallet. После нажмите кнопку "Добавить учетную запись".

      step-6

    3. Поздравляем, вы создали кошелек polkadot.js!

      step-7

    Импортировать существующую мнемонику

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • Как показано ниже, иногда при первой установке или обновлении кошелька Substrate требуется обновить метаданные кошелька.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    Как сделать резервную копию моего кошелька?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/ru/docs/farming-&-staking/wallets/subwallet/index.html b/ru/docs/farming-&-staking/wallets/subwallet/index.html index 515edba0d15..6d757b7f6cf 100644 --- a/ru/docs/farming-&-staking/wallets/subwallet/index.html +++ b/ru/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    Как сделать резервную копию моего кошелька?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/ru/docs/learn/intro/index.html b/ru/docs/learn/intro/index.html index f2e116ea8c6..cf9111fd189 100644 --- a/ru/docs/learn/intro/index.html +++ b/ru/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    👋 Добро пожаловать!

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    Сеть Subspace стремится предоставить удивительный опыт разработчика всем, кто желает построить на вершине протокола. В этом случае мы начали работать над разнообразными инструментами для помощи в разработке в нашей сети.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/ru/docs/learn/security/index.html b/ru/docs/learn/security/index.html index 113670b0c2e..1f36c21687d 100644 --- a/ru/docs/learn/security/index.html +++ b/ru/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/ru/docs/learn/subnomicon/index.html b/ru/docs/learn/subnomicon/index.html index f8315c61e26..d47663fdb09 100644 --- a/ru/docs/learn/subnomicon/index.html +++ b/ru/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/ru/docs/participate/CODE_OF_CONDUCT/index.html b/ru/docs/participate/CODE_OF_CONDUCT/index.html index 2d7ea74c984..68538750381 100644 --- a/ru/docs/participate/CODE_OF_CONDUCT/index.html +++ b/ru/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -40,7 +40,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/ru/docs/participate/contribute/index.html b/ru/docs/participate/contribute/index.html index af2adc665fb..6f443224f68 100644 --- a/ru/docs/participate/contribute/index.html +++ b/ru/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Ознакомьтесь с некоторыми из этих замечательных руководств, которые помогут вам освоить GitHub и внести свой вклад.

    Продвинутое исправление

    Этот раздел предполагает более глубокое понимание GitHub, а также основ программирования.

    При выполнении более крупных и сложных работ по устранению неисправностей необходимо следовать приведенным ниже основным принципам.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Комментируйте сложный и нетривиальный код, сложная логика должна быть понятна.
    • Все публичные функции должны быть прокомментированы.
    • Если код тривиален, но со временем может быть забыт, пожалуйста, прокомментируйте его.
    • Попробуйте взглянуть на свой код от третьего лица, он должен быть понятен любому человеку, имеющему опыт работы с технологией, которую вы используете.
    • Иногда сложный для понимания код нуждается в рефакторинге, а не в дополнительных комментариях.
    • Убедитесь, что программа все еще может быть создана и запущена до подачи pull request.

    Для более сложных исправлений следует следовать общему пути GitHub.

    1. Create your own fork of the code. Fork
    2. Выполните изменения локально на своей системе в предпочитаемой среде разработки.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    Как сообщить об ошибке или неисправности

    У нас нет какого-либо строгого шаблона, которому вы должны следовать, но, пожалуйста, предоставьте всю необходимую информацию, чтобы мы могли быстро решить любые вопросы.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    Как предложить функцию или улучшение

    Эта документация предназначена для сообщества, поэтому любые пожелания по функциям приветствуются.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Объясните, зачем нужна эта функция и какие проблемы она позволит решить.
    • Укажите, можете ли вы/хотите ли вы помочь в реализации этой функции.

    Процесс рецензирования кода

    • Команда рассмотрит все запросы (pull requests) на внесение изменений как можно скорее, обычно ответ приходит в течение одного-двух дней.
    • Если это простое и непротиворечивое исправление, мы рассмотрим и одобрим код.
    • Если возникнут вопросы, замечания или потребуется дополнительное обсуждение, мы свяжемся с автором Pull Request, чтобы попытаться решить эти вопросы.
    • При отсутствии ответа или активности в течение 2 недель после ответа команды мы можем закрыть pull request.

    Сообщество

    Вы можете пообщаться с командой в Discord: https\://discord.gg/subspace-network

    - + \ No newline at end of file diff --git a/ru/docs/participate/index.html b/ru/docs/participate/index.html index 10436463aac..7b1d2da0963 100644 --- a/ru/docs/participate/index.html +++ b/ru/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Удивительный SubSpace

    осторожность

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Статьи

    Информация

    F.A.Q

    Getting Started Farming

    Medium

    Руководство по началу работы

    Приведение консенсуса PoC до Substrate

    Subspace - первый протокол, полностью разрешающий трилемму блокчейна без компромиссов. Provided by solgas

    События

    Первая АМА

    Memes & Humor


    - + \ No newline at end of file diff --git a/ru/docs/participate/translate/index.html b/ru/docs/participate/translate/index.html index 345a9e35c59..8071b31097e 100644 --- a/ru/docs/participate/translate/index.html +++ b/ru/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Версия: последние

    Руководство по переводу

    Руководство по переводу

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Требования

    Рекомендации

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    Инструкция

    Ниже вы найдете информацию о том, как обеспечить переводы для сети Subspace через портал переводов Crowdin.

    1. Посетите соответствующий портал переводов, для которого вы хотели бы помочь с переводом (см. выше)

      translate-step-1

    2. Как только вы войдете в проект и присоединитесь к нему, вы будете перенаправлены на панель инструментов проекта, выберите язык, который вы хотите перевести. (см. ниже)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. Затем вы попадете на портал переводов, на этом портале вы найдете следующее

      1. Английская версия текста
      2. Укажите язык ввода перевода английского текста
      3. Автоматическое предложение текста
      4. Список слов, который необходимо перевести
      5. Точка для комментариев, если что-то нуждается в пояснениях

      translate-step-4

    5. Отсюда вы сможете заполнить ваши переводы, как только захотите, и завершите работу.

    6. Ваш перевод будет рассмотрен и одобрен своевременно, пожалуйста, обратите внимание, что перевод может занять пару дней, прежде чем он появится в развернутой документации.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/additional-guides/index.html b/ru/docs/pre-release/category/additional-guides/index.html index 30d3e161090..a79e40f2d19 100644 --- a/ru/docs/pre-release/category/additional-guides/index.html +++ b/ru/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Additional Guides

    Misc. Guides for the Subspace Network

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/advanced-cli/index.html b/ru/docs/pre-release/category/advanced-cli/index.html index 97228604031..2698c561fe6 100644 --- a/ru/docs/pre-release/category/advanced-cli/index.html +++ b/ru/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/develop-on-nova-evm-/index.html b/ru/docs/pre-release/category/develop-on-nova-evm-/index.html index a7a0611a419..802a0a952dd 100644 --- a/ru/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/ru/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/develop/index.html b/ru/docs/pre-release/category/develop/index.html index 7a2c7b1256e..e94286eb451 100644 --- a/ru/docs/pre-release/category/develop/index.html +++ b/ru/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Develop

    All Subspace Development Guides

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/farming/index.html b/ru/docs/pre-release/category/farming/index.html index 2026bc58699..b74d95cb7fa 100644 --- a/ru/docs/pre-release/category/farming/index.html +++ b/ru/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Farming

    All community provided resources are non-official. For clarification please refer to our official docs.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/learn/index.html b/ru/docs/pre-release/category/learn/index.html index 69fa554e237..dfa60aebb66 100644 --- a/ru/docs/pre-release/category/learn/index.html +++ b/ru/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Learn

    Learn about the Subspace Network

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/operators-and-nominators/index.html b/ru/docs/pre-release/category/operators-and-nominators/index.html index 84acb0797ed..dddf08faef3 100644 --- a/ru/docs/pre-release/category/operators-and-nominators/index.html +++ b/ru/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Operators and Nominators

    Subspace domain sub-protocols

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/participate/index.html b/ru/docs/pre-release/category/participate/index.html index 92458025f9b..027df2c02a5 100644 --- a/ru/docs/pre-release/category/participate/index.html +++ b/ru/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/pulsar-recommended/index.html b/ru/docs/pre-release/category/pulsar-recommended/index.html index 5840828e59c..b92c42b9057 100644 --- a/ru/docs/pre-release/category/pulsar-recommended/index.html +++ b/ru/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/category/wallets/index.html b/ru/docs/pre-release/category/wallets/index.html index cc7c082168d..c13ed07e0ec 100644 --- a/ru/docs/pre-release/category/wallets/index.html +++ b/ru/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Кошельки

    Выберите, какой Substrate Wallet вы хотите использовать.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/block_explorer/index.html b/ru/docs/pre-release/develop/nova/block_explorer/index.html index e48692b6052..f689f1c9633 100644 --- a/ru/docs/pre-release/develop/nova/block_explorer/index.html +++ b/ru/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/faucet/index.html b/ru/docs/pre-release/develop/nova/faucet/index.html index de73fd85ddb..ec50a8b6f7a 100644 --- a/ru/docs/pre-release/develop/nova/faucet/index.html +++ b/ru/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/foundry_guide/index.html b/ru/docs/pre-release/develop/nova/foundry_guide/index.html index 2f73d47dfd9..6a8385254c9 100644 --- a/ru/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/ru/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/general-information/index.html b/ru/docs/pre-release/develop/nova/general-information/index.html index 6f15aceddd6..3709567402c 100644 --- a/ru/docs/pre-release/develop/nova/general-information/index.html +++ b/ru/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Версия: Предварительный выпуск

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/hardhat_guide/index.html b/ru/docs/pre-release/develop/nova/hardhat_guide/index.html index 872f7d6504f..fefbbc6faa8 100644 --- a/ru/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/ru/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/intro/index.html b/ru/docs/pre-release/develop/nova/intro/index.html index 90d84f4a8d2..3c304100670 100644 --- a/ru/docs/pre-release/develop/nova/intro/index.html +++ b/ru/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/local_development/index.html b/ru/docs/pre-release/develop/nova/local_development/index.html index c07d5bdb8e2..e7909c8adaa 100644 --- a/ru/docs/pre-release/develop/nova/local_development/index.html +++ b/ru/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Версия: Предварительный выпуск

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/quick_start/index.html b/ru/docs/pre-release/develop/nova/quick_start/index.html index 68f948ab329..61bb68f460a 100644 --- a/ru/docs/pre-release/develop/nova/quick_start/index.html +++ b/ru/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Версия: Предварительный выпуск

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/remix_guide/index.html b/ru/docs/pre-release/develop/nova/remix_guide/index.html index 65c485ee892..b488c90c96a 100644 --- a/ru/docs/pre-release/develop/nova/remix_guide/index.html +++ b/ru/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/develop/nova/setting-up-metamask/index.html b/ru/docs/pre-release/develop/nova/setting-up-metamask/index.html index b66d6266f1c..76f93ef59cc 100644 --- a/ru/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/ru/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      инфо

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/ru/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 6763d370955..08221d045e4 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 8e3dc960ed0..be647f0d82a 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 7c851fd941c..e19536c61a0 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Версия: Предварительный выпуск

    Требования

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareХарактеристики
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 3e42629f16d..e1fbd20085d 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Версия: Предварительный выпуск

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    инфо

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 298fce68fb3..57e8f36df1f 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Версия: Предварительный выпуск

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    инфо

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/ru/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 77b7e01c31b..c94811b779d 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 58ee0bd8210..b56b37b0c15 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    опасность

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 848baad1412..08442b180b5 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Версия: Предварительный выпуск

    Требования

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareХарактеристики
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 9266cea2e51..d39ff5589d3 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 259fc6a74f1..c838ca4c76f 100644 --- a/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/ru/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    инфо

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/index.html b/ru/docs/pre-release/farming-&-staking/index.html index f32cc63b25e..2f1bd5a7b32 100644 --- a/ru/docs/pre-release/farming-&-staking/index.html +++ b/ru/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/staking/index.html b/ru/docs/pre-release/farming-&-staking/staking/index.html index 88af9d00fe8..b98238bb4bc 100644 --- a/ru/docs/pre-release/farming-&-staking/staking/index.html +++ b/ru/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/staking/intro/index.html b/ru/docs/pre-release/farming-&-staking/staking/intro/index.html index 36695cc5d9c..96406ff2a39 100644 --- a/ru/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/ru/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/staking/operators/index.html b/ru/docs/pre-release/farming-&-staking/staking/operators/index.html index 0521a7db510..702c0de009b 100644 --- a/ru/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/ru/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    инфо

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    инфо

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    инфо

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    инфо

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    инфо

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/timekeeping/index.html b/ru/docs/pre-release/farming-&-staking/timekeeping/index.html index b897c5b8167..18d934e7545 100644 --- a/ru/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/ru/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareХарактеристики
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/ru/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index f922d29af76..fa32d172d00 100644 --- a/ru/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/ru/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    Это самый простой кошелек. Это связано с тем, что он является базовым кошельком Substrate, поддерживающим все сети на основе Substrate. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Polkadot.js - это Substrate/EVM-кошелек, от создателей Substrate и Polkadota/Kusama, а именно, от команды Parity.

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. После этого расширение покажет вам вашу мнемоническую комбинацию из 12 слов.

    опасность

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. После того как вы сохраните вашу мнемоническую фразу, установите флажок "Я надежно сохранил свою мнемоническую фразу" и нажмите кнопку "Следующий шаг".

    2. The next step will ask for a Name & Password for the wallet. После нажмите кнопку "Добавить учетную запись".

      step-6

    3. Поздравляем, вы создали кошелек polkadot.js!

      step-7

    Импортировать существующую мнемонику

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • Как показано ниже, иногда при первой установке или обновлении кошелька Substrate требуется обновить метаданные кошелька.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    Как сделать резервную копию моего кошелька?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/ru/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index f2937f11691..5275da92ac2 100644 --- a/ru/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/ru/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    Как сделать резервную копию моего кошелька?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/learn/intro/index.html b/ru/docs/pre-release/learn/intro/index.html index b432ecac13c..8e417207b68 100644 --- a/ru/docs/pre-release/learn/intro/index.html +++ b/ru/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    👋 Добро пожаловать!

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    Сеть Subspace стремится предоставить удивительный опыт разработчика всем, кто желает построить на вершине протокола. В этом случае мы начали работать над разнообразными инструментами для помощи в разработке в нашей сети.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/learn/security/index.html b/ru/docs/pre-release/learn/security/index.html index 6846623a94e..e37ed950180 100644 --- a/ru/docs/pre-release/learn/security/index.html +++ b/ru/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/learn/subnomicon/index.html b/ru/docs/pre-release/learn/subnomicon/index.html index cd200a4f193..d70f6343b50 100644 --- a/ru/docs/pre-release/learn/subnomicon/index.html +++ b/ru/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/ru/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 6f204c52131..2ac7d864be2 100644 --- a/ru/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/ru/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -40,7 +40,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/participate/contribute/index.html b/ru/docs/pre-release/participate/contribute/index.html index 946b011ca5c..23cded141c0 100644 --- a/ru/docs/pre-release/participate/contribute/index.html +++ b/ru/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Ознакомьтесь с некоторыми из этих замечательных руководств, которые помогут вам освоить GitHub и внести свой вклад.

    Продвинутое исправление

    Этот раздел предполагает более глубокое понимание GitHub, а также основ программирования.

    При выполнении более крупных и сложных работ по устранению неисправностей необходимо следовать приведенным ниже основным принципам.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Комментируйте сложный и нетривиальный код, сложная логика должна быть понятна.
    • Все публичные функции должны быть прокомментированы.
    • Если код тривиален, но со временем может быть забыт, пожалуйста, прокомментируйте его.
    • Попробуйте взглянуть на свой код от третьего лица, он должен быть понятен любому человеку, имеющему опыт работы с технологией, которую вы используете.
    • Иногда сложный для понимания код нуждается в рефакторинге, а не в дополнительных комментариях.
    • Убедитесь, что программа все еще может быть создана и запущена до подачи pull request.

    Для более сложных исправлений следует следовать общему пути GitHub.

    1. Create your own fork of the code. Fork
    2. Выполните изменения локально на своей системе в предпочитаемой среде разработки.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    Как сообщить об ошибке или неисправности

    У нас нет какого-либо строгого шаблона, которому вы должны следовать, но, пожалуйста, предоставьте всю необходимую информацию, чтобы мы могли быстро решить любые вопросы.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    Как предложить функцию или улучшение

    Эта документация предназначена для сообщества, поэтому любые пожелания по функциям приветствуются.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Объясните, зачем нужна эта функция и какие проблемы она позволит решить.
    • Укажите, можете ли вы/хотите ли вы помочь в реализации этой функции.

    Процесс рецензирования кода

    • Команда рассмотрит все запросы (pull requests) на внесение изменений как можно скорее, обычно ответ приходит в течение одного-двух дней.
    • Если это простое и непротиворечивое исправление, мы рассмотрим и одобрим код.
    • Если возникнут вопросы, замечания или потребуется дополнительное обсуждение, мы свяжемся с автором Pull Request, чтобы попытаться решить эти вопросы.
    • При отсутствии ответа или активности в течение 2 недель после ответа команды мы можем закрыть pull request.

    Сообщество

    Вы можете пообщаться с командой в Discord: https\://discord.gg/subspace-network

    - + \ No newline at end of file diff --git a/ru/docs/pre-release/participate/index.html b/ru/docs/pre-release/participate/index.html index fa6b1a2cc08..3380e9a6b4a 100644 --- a/ru/docs/pre-release/participate/index.html +++ b/ru/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Удивительный SubSpace

    осторожность

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Статьи

    Информация

    F.A.Q

    Getting Started Farming

    Medium

    Руководство по началу работы

    Приведение консенсуса PoC до Substrate

    Subspace - первый протокол, полностью разрешающий трилемму блокчейна без компромиссов. Provided by solgas

    События

    Первая АМА

    Memes & Humor


    - + \ No newline at end of file diff --git a/ru/docs/pre-release/participate/translate/index.html b/ru/docs/pre-release/participate/translate/index.html index eb8f7a900ac..f0002b377fb 100644 --- a/ru/docs/pre-release/participate/translate/index.html +++ b/ru/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Версия: Предварительный выпуск

    Руководство по переводу

    Руководство по переводу

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Требования

    Рекомендации

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    Инструкция

    Ниже вы найдете информацию о том, как обеспечить переводы для сети Subspace через портал переводов Crowdin.

    1. Посетите соответствующий портал переводов, для которого вы хотели бы помочь с переводом (см. выше)

      translate-step-1

    2. Как только вы войдете в проект и присоединитесь к нему, вы будете перенаправлены на панель инструментов проекта, выберите язык, который вы хотите перевести. (см. ниже)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. Затем вы попадете на портал переводов, на этом портале вы найдете следующее

      1. Английская версия текста
      2. Укажите язык ввода перевода английского текста
      3. Автоматическое предложение текста
      4. Список слов, который необходимо перевести
      5. Точка для комментариев, если что-то нуждается в пояснениях

      translate-step-4

    5. Отсюда вы сможете заполнить ваши переводы, как только захотите, и завершите работу.

    6. Ваш перевод будет рассмотрен и одобрен своевременно, пожалуйста, обратите внимание, что перевод может занять пару дней, прежде чем он появится в развернутой документации.

    - + \ No newline at end of file diff --git a/ru/index.html b/ru/index.html index bb80dfa4392..b176fb63f1e 100644 --- a/ru/index.html +++ b/ru/index.html @@ -7,13 +7,13 @@ - +

    Ферма отовсюду

    Зарабатывайте награды, запуская фермерский узел, обещая свободный диск. Не требуется дорогая настройка или предварительный капитал.

    Лёгкий

    'Запустите фармерский узел в фоновом режиме на вашем компьютере без ущерба для ежедневного использования и с минимальным обслуживанием.'

    'Простота настройки'

    'Настройка приложения занимает всего несколько минут. Поддерживаются операционные системы Linux, Windows и macOS.'

    'Частые вознаграждения'

    'Получайте вознаграждение, внося свой вклад в глобально распределенную сеть, которая возвращает контроль пользователям и создателям.'

    - + \ No newline at end of file diff --git a/ru/markdown-page/index.html b/ru/markdown-page/index.html index 674aa163085..69e0bd610d1 100644 --- a/ru/markdown-page/index.html +++ b/ru/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/404.html b/tr/404.html index ff98862ceb2..30bcb09c4af 100644 --- a/tr/404.html +++ b/tr/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/assets/js/90c31cf5.5002c3f3.js b/tr/assets/js/90c31cf5.5002c3f3.js deleted file mode 100644 index 03590b54b01..00000000000 --- a/tr/assets/js/90c31cf5.5002c3f3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[9237],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8237:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/tr/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/tr/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/tr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/tr/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/tr/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/tr/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/tr/assets/js/90c31cf5.e970c90f.js b/tr/assets/js/90c31cf5.e970c90f.js new file mode 100644 index 00000000000..42b668ef522 --- /dev/null +++ b/tr/assets/js/90c31cf5.e970c90f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[9237],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},8237:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/tr/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/tr/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/tr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/tr/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/tr/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/tr/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/tr/assets/js/f3e71eb2.b0948441.js b/tr/assets/js/f3e71eb2.b0948441.js deleted file mode 100644 index b2b4744033e..00000000000 --- a/tr/assets/js/f3e71eb2.b0948441.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5510],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},4205:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/tr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/tr/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/tr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/tr/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/tr/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/tr/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/tr/assets/js/f3e71eb2.d8e87182.js b/tr/assets/js/f3e71eb2.d8e87182.js new file mode 100644 index 00000000000..8542ab2fb4e --- /dev/null +++ b/tr/assets/js/f3e71eb2.d8e87182.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5510],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},4205:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/tr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/tr/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/tr/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/tr/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/tr/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/tr/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/tr/assets/js/runtime~main.6d65b94d.js b/tr/assets/js/runtime~main.3a761634.js similarity index 97% rename from tr/assets/js/runtime~main.6d65b94d.js rename to tr/assets/js/runtime~main.3a761634.js index efa2d861878..087de0d91b3 100644 --- a/tr/assets/js/runtime~main.6d65b94d.js +++ b/tr/assets/js/runtime~main.3a761634.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,c,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(a,f,c,b)=>{if(!f){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,c,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",93:"3add780a",205:"781105fe",450:"bb702bd6",482:"6f34916e",486:"223cd081",763:"c7a7e123",784:"71ef2666",1377:"cb3bc190",1404:"091a5146",1484:"3a5b5a1d",1511:"1a3c65c2",2192:"3fb58b05",2246:"b50c87ca",2384:"1f3ae80b",2785:"5cd4bf7d",2958:"b4caf2d0",3064:"e0462e93",3085:"1f391b9e",3216:"dca77913",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3355:"f9243174",3484:"7f5b45b1",3525:"74e2286b",3664:"bc9e5e71",3665:"94016e65",3813:"32053c95",3994:"1a10a6ac",3996:"edfdfaa4",4011:"d4a64213",4022:"dc40edc0",4337:"93db7d24",4477:"91d15b8e",4534:"9997a6c2",4646:"a5b23fb7",4753:"bf5e9595",4787:"f5729cf0",4799:"c8386d85",4843:"a78dee57",4975:"e94ff44d",5130:"ac1f6e15",5218:"c930d645",5322:"ba320ffc",5338:"14578996",5457:"bba291c8",5510:"f3e71eb2",5604:"697287e4",5608:"c01d0728",5828:"e5912ecc",5960:"cea7c09f",6136:"423b989d",6225:"bd6ce893",6370:"128cda8a",6429:"8667e6a1",6479:"79552ee0",6549:"76459fac",6685:"1a0b0667",6871:"673e8ed8",7241:"d04d88f1",7340:"a9828477",7370:"c09f4ff7",7391:"e32b50cf",7414:"393be207",7464:"329c4748",7466:"04bc18d2",7573:"1866ef2b",7576:"a0e5ddd1",7846:"c99f1b83",7918:"17896441",7963:"bbf2ba4e",8065:"601f6fc3",8100:"34bab374",8192:"a6b2fff5",8279:"e4566bd7",8338:"aadc2799",8356:"ce87c2b5",8366:"9381ae4e",8441:"57ae328a",8553:"6f532f77",8570:"7242dda4",8630:"f703984c",8834:"b73a2dd2",8835:"2023947b",9002:"09a97d9f",9015:"a6752d27",9211:"eca955eb",9237:"90c31cf5",9410:"635927bd",9434:"5be21e1a",9438:"8ae7a271",9504:"186ede14",9514:"1be78505",9533:"82bbc7c1",9736:"9819aa4a",9817:"14eb3368",9936:"9d3cc241"}[e]||e)+"."+{53:"48ddccc6",93:"f921b058",205:"79e3ef3b",450:"a2450985",482:"de125c8a",486:"26e97cb3",763:"1c02d957",784:"8686833f",814:"dc8c3a26",1377:"47927989",1404:"cc92bcc2",1484:"08e3003f",1511:"5cc59538",2192:"3683ecc5",2246:"306c9627",2384:"33728473",2785:"23e7abc5",2958:"6e8bcd80",3064:"ece659ba",3085:"3a447380",3203:"c0b8bfe8",3216:"46f4ebe4",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3355:"756410c5",3473:"fdffa07c",3484:"be3f0436",3525:"d47dcf2b",3664:"e5ad158d",3665:"ccdba7f4",3813:"323a90c9",3994:"34baa576",3996:"17f90d31",4011:"4a503089",4022:"81134343",4337:"0a2a6caf",4477:"8f3d9765",4534:"98aff5e2",4646:"76d1b169",4753:"b5bb893c",4787:"df6809ab",4799:"17f564a9",4843:"bcd13953",4972:"4a54fd4a",4975:"7b9217c4",5130:"079804bc",5218:"f7ecdec8",5322:"ecd364f7",5338:"d27cf0ea",5457:"6aaeb07a",5510:"b0948441",5604:"a6a46499",5608:"1d466f7b",5828:"7143a374",5960:"95eb2bd2",6136:"0e4dad8f",6225:"9a747442",6370:"f98566e9",6429:"ca5eba35",6479:"d9041abd",6549:"8df669dc",6685:"3986487f",6871:"ec68b2ea",7241:"b8325358",7340:"461125fe",7370:"8d2f1de1",7391:"8085241a",7414:"7697c324",7464:"5d7a94e2",7466:"722112e2",7573:"2803d143",7576:"877c1198",7846:"46aad65d",7918:"e3da5265",7963:"bf15c158",8065:"cf0e74e8",8100:"391cecbd",8192:"70c450dd",8279:"cd9470f1",8338:"f0262cbe",8356:"1c776c69",8366:"eb167772",8441:"d3e35bbf",8553:"2248d4e7",8570:"7accfe9e",8630:"d1b71d49",8834:"dd1b5f0c",8835:"b7f7bb67",9002:"22b7c3d1",9015:"d207a8d2",9211:"16c9ba34",9237:"5002c3f3",9410:"135f6cba",9434:"43f2fb20",9438:"209ccdeb",9504:"43672eff",9514:"478c02c6",9533:"8d30c527",9736:"8ca93535",9817:"b7ea7ab7",9936:"0c41f087"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},b="portal:",r.l=(e,a,f,d)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/tr/",r.gca=function(e){return e={14578996:"5338",17896441:"7918","935f2afb":"53","3add780a":"93","781105fe":"205",bb702bd6:"450","6f34916e":"482","223cd081":"486",c7a7e123:"763","71ef2666":"784",cb3bc190:"1377","091a5146":"1404","3a5b5a1d":"1484","1a3c65c2":"1511","3fb58b05":"2192",b50c87ca:"2246","1f3ae80b":"2384","5cd4bf7d":"2785",b4caf2d0:"2958",e0462e93:"3064","1f391b9e":"3085",dca77913:"3216",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",f9243174:"3355","7f5b45b1":"3484","74e2286b":"3525",bc9e5e71:"3664","94016e65":"3665","32053c95":"3813","1a10a6ac":"3994",edfdfaa4:"3996",d4a64213:"4011",dc40edc0:"4022","93db7d24":"4337","91d15b8e":"4477","9997a6c2":"4534",a5b23fb7:"4646",bf5e9595:"4753",f5729cf0:"4787",c8386d85:"4799",a78dee57:"4843",e94ff44d:"4975",ac1f6e15:"5130",c930d645:"5218",ba320ffc:"5322",bba291c8:"5457",f3e71eb2:"5510","697287e4":"5604",c01d0728:"5608",e5912ecc:"5828",cea7c09f:"5960","423b989d":"6136",bd6ce893:"6225","128cda8a":"6370","8667e6a1":"6429","79552ee0":"6479","76459fac":"6549","1a0b0667":"6685","673e8ed8":"6871",d04d88f1:"7241",a9828477:"7340",c09f4ff7:"7370",e32b50cf:"7391","393be207":"7414","329c4748":"7464","04bc18d2":"7466","1866ef2b":"7573",a0e5ddd1:"7576",c99f1b83:"7846",bbf2ba4e:"7963","601f6fc3":"8065","34bab374":"8100",a6b2fff5:"8192",e4566bd7:"8279",aadc2799:"8338",ce87c2b5:"8356","9381ae4e":"8366","57ae328a":"8441","6f532f77":"8553","7242dda4":"8570",f703984c:"8630",b73a2dd2:"8834","2023947b":"8835","09a97d9f":"9002",a6752d27:"9015",eca955eb:"9211","90c31cf5":"9237","635927bd":"9410","5be21e1a":"9434","8ae7a271":"9438","186ede14":"9504","1be78505":"9514","82bbc7c1":"9533","9819aa4a":"9736","14eb3368":"9817","9d3cc241":"9936"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>c=e[a]=[f,b]));f.push(c[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var b=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,b,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,c,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return d[e].call(f.exports,f,f.exports,r),f.exports}r.m=d,e=[],r.O=(a,f,c,b)=>{if(!f){var d=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,c,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var d={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,r.d(b,d),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",93:"3add780a",205:"781105fe",450:"bb702bd6",482:"6f34916e",486:"223cd081",763:"c7a7e123",784:"71ef2666",1377:"cb3bc190",1404:"091a5146",1484:"3a5b5a1d",1511:"1a3c65c2",2192:"3fb58b05",2246:"b50c87ca",2384:"1f3ae80b",2785:"5cd4bf7d",2958:"b4caf2d0",3064:"e0462e93",3085:"1f391b9e",3216:"dca77913",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3355:"f9243174",3484:"7f5b45b1",3525:"74e2286b",3664:"bc9e5e71",3665:"94016e65",3813:"32053c95",3994:"1a10a6ac",3996:"edfdfaa4",4011:"d4a64213",4022:"dc40edc0",4337:"93db7d24",4477:"91d15b8e",4534:"9997a6c2",4646:"a5b23fb7",4753:"bf5e9595",4787:"f5729cf0",4799:"c8386d85",4843:"a78dee57",4975:"e94ff44d",5130:"ac1f6e15",5218:"c930d645",5322:"ba320ffc",5338:"14578996",5457:"bba291c8",5510:"f3e71eb2",5604:"697287e4",5608:"c01d0728",5828:"e5912ecc",5960:"cea7c09f",6136:"423b989d",6225:"bd6ce893",6370:"128cda8a",6429:"8667e6a1",6479:"79552ee0",6549:"76459fac",6685:"1a0b0667",6871:"673e8ed8",7241:"d04d88f1",7340:"a9828477",7370:"c09f4ff7",7391:"e32b50cf",7414:"393be207",7464:"329c4748",7466:"04bc18d2",7573:"1866ef2b",7576:"a0e5ddd1",7846:"c99f1b83",7918:"17896441",7963:"bbf2ba4e",8065:"601f6fc3",8100:"34bab374",8192:"a6b2fff5",8279:"e4566bd7",8338:"aadc2799",8356:"ce87c2b5",8366:"9381ae4e",8441:"57ae328a",8553:"6f532f77",8570:"7242dda4",8630:"f703984c",8834:"b73a2dd2",8835:"2023947b",9002:"09a97d9f",9015:"a6752d27",9211:"eca955eb",9237:"90c31cf5",9410:"635927bd",9434:"5be21e1a",9438:"8ae7a271",9504:"186ede14",9514:"1be78505",9533:"82bbc7c1",9736:"9819aa4a",9817:"14eb3368",9936:"9d3cc241"}[e]||e)+"."+{53:"48ddccc6",93:"f921b058",205:"79e3ef3b",450:"a2450985",482:"de125c8a",486:"26e97cb3",763:"1c02d957",784:"8686833f",814:"dc8c3a26",1377:"47927989",1404:"cc92bcc2",1484:"08e3003f",1511:"5cc59538",2192:"3683ecc5",2246:"306c9627",2384:"33728473",2785:"23e7abc5",2958:"6e8bcd80",3064:"ece659ba",3085:"3a447380",3203:"c0b8bfe8",3216:"46f4ebe4",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3355:"756410c5",3473:"fdffa07c",3484:"be3f0436",3525:"d47dcf2b",3664:"e5ad158d",3665:"ccdba7f4",3813:"323a90c9",3994:"34baa576",3996:"17f90d31",4011:"4a503089",4022:"81134343",4337:"0a2a6caf",4477:"8f3d9765",4534:"98aff5e2",4646:"76d1b169",4753:"b5bb893c",4787:"df6809ab",4799:"17f564a9",4843:"bcd13953",4972:"4a54fd4a",4975:"7b9217c4",5130:"079804bc",5218:"f7ecdec8",5322:"ecd364f7",5338:"d27cf0ea",5457:"6aaeb07a",5510:"d8e87182",5604:"a6a46499",5608:"1d466f7b",5828:"7143a374",5960:"95eb2bd2",6136:"0e4dad8f",6225:"9a747442",6370:"f98566e9",6429:"ca5eba35",6479:"d9041abd",6549:"8df669dc",6685:"3986487f",6871:"ec68b2ea",7241:"b8325358",7340:"461125fe",7370:"8d2f1de1",7391:"8085241a",7414:"7697c324",7464:"5d7a94e2",7466:"722112e2",7573:"2803d143",7576:"877c1198",7846:"46aad65d",7918:"e3da5265",7963:"bf15c158",8065:"cf0e74e8",8100:"391cecbd",8192:"70c450dd",8279:"cd9470f1",8338:"f0262cbe",8356:"1c776c69",8366:"eb167772",8441:"d3e35bbf",8553:"2248d4e7",8570:"7accfe9e",8630:"d1b71d49",8834:"dd1b5f0c",8835:"b7f7bb67",9002:"22b7c3d1",9015:"d207a8d2",9211:"16c9ba34",9237:"e970c90f",9410:"135f6cba",9434:"43f2fb20",9438:"209ccdeb",9504:"43672eff",9514:"478c02c6",9533:"8d30c527",9736:"8ca93535",9817:"b7ea7ab7",9936:"0c41f087"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},b="portal:",r.l=(e,a,f,d)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/tr/",r.gca=function(e){return e={14578996:"5338",17896441:"7918","935f2afb":"53","3add780a":"93","781105fe":"205",bb702bd6:"450","6f34916e":"482","223cd081":"486",c7a7e123:"763","71ef2666":"784",cb3bc190:"1377","091a5146":"1404","3a5b5a1d":"1484","1a3c65c2":"1511","3fb58b05":"2192",b50c87ca:"2246","1f3ae80b":"2384","5cd4bf7d":"2785",b4caf2d0:"2958",e0462e93:"3064","1f391b9e":"3085",dca77913:"3216",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",f9243174:"3355","7f5b45b1":"3484","74e2286b":"3525",bc9e5e71:"3664","94016e65":"3665","32053c95":"3813","1a10a6ac":"3994",edfdfaa4:"3996",d4a64213:"4011",dc40edc0:"4022","93db7d24":"4337","91d15b8e":"4477","9997a6c2":"4534",a5b23fb7:"4646",bf5e9595:"4753",f5729cf0:"4787",c8386d85:"4799",a78dee57:"4843",e94ff44d:"4975",ac1f6e15:"5130",c930d645:"5218",ba320ffc:"5322",bba291c8:"5457",f3e71eb2:"5510","697287e4":"5604",c01d0728:"5608",e5912ecc:"5828",cea7c09f:"5960","423b989d":"6136",bd6ce893:"6225","128cda8a":"6370","8667e6a1":"6429","79552ee0":"6479","76459fac":"6549","1a0b0667":"6685","673e8ed8":"6871",d04d88f1:"7241",a9828477:"7340",c09f4ff7:"7370",e32b50cf:"7391","393be207":"7414","329c4748":"7464","04bc18d2":"7466","1866ef2b":"7573",a0e5ddd1:"7576",c99f1b83:"7846",bbf2ba4e:"7963","601f6fc3":"8065","34bab374":"8100",a6b2fff5:"8192",e4566bd7:"8279",aadc2799:"8338",ce87c2b5:"8356","9381ae4e":"8366","57ae328a":"8441","6f532f77":"8553","7242dda4":"8570",f703984c:"8630",b73a2dd2:"8834","2023947b":"8835","09a97d9f":"9002",a6752d27:"9015",eca955eb:"9211","90c31cf5":"9237","635927bd":"9410","5be21e1a":"9434","8ae7a271":"9438","186ede14":"9504","1be78505":"9514","82bbc7c1":"9533","9819aa4a":"9736","14eb3368":"9817","9d3cc241":"9936"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((f,b)=>c=e[a]=[f,b]));f.push(c[2]=b);var d=r.p+r.u(a),t=new Error;r.l(d,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var b=f&&("load"===f.type?"missing":f.type),d=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",t.name="ChunkLoadError",t.type=b,t.request=d,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,b,d=f[0],t=f[1],o=f[2],n=0;if(d.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/tr/docs/category/advanced-cli/index.html b/tr/docs/category/advanced-cli/index.html index 94cf97dbe3a..ed1813c812b 100644 --- a/tr/docs/category/advanced-cli/index.html +++ b/tr/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/category/develop-on-nova-evm-/index.html b/tr/docs/category/develop-on-nova-evm-/index.html index cdcc12fb9b0..b6a0d15d0ef 100644 --- a/tr/docs/category/develop-on-nova-evm-/index.html +++ b/tr/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/tr/docs/category/develop/index.html b/tr/docs/category/develop/index.html index 6f047e7f385..0e83e5af741 100644 --- a/tr/docs/category/develop/index.html +++ b/tr/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/category/farming/index.html b/tr/docs/category/farming/index.html index e3ad7befd4c..5a1df396d57 100644 --- a/tr/docs/category/farming/index.html +++ b/tr/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/category/learn/index.html b/tr/docs/category/learn/index.html index 0f265967942..29f1e7f0bc6 100644 --- a/tr/docs/category/learn/index.html +++ b/tr/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/category/operators-and-nominators/index.html b/tr/docs/category/operators-and-nominators/index.html index 376a643a7d4..9ff3a6427d7 100644 --- a/tr/docs/category/operators-and-nominators/index.html +++ b/tr/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/category/participate/index.html b/tr/docs/category/participate/index.html index c43a9ff6b60..f5eb8140b95 100644 --- a/tr/docs/category/participate/index.html +++ b/tr/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/category/pulsar-recommended/index.html b/tr/docs/category/pulsar-recommended/index.html index 7b7830ffb3f..b80b6df2652 100644 --- a/tr/docs/category/pulsar-recommended/index.html +++ b/tr/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/category/wallets/index.html b/tr/docs/category/wallets/index.html index 194773cfe56..06aa2816d80 100644 --- a/tr/docs/category/wallets/index.html +++ b/tr/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/develop/nova/block_explorer/index.html b/tr/docs/develop/nova/block_explorer/index.html index 4e6c10e7cb3..e3aef0868c9 100644 --- a/tr/docs/develop/nova/block_explorer/index.html +++ b/tr/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/develop/nova/faucet/index.html b/tr/docs/develop/nova/faucet/index.html index 2892f0de5b3..ac1b83ab963 100644 --- a/tr/docs/develop/nova/faucet/index.html +++ b/tr/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/tr/docs/develop/nova/foundry_guide/index.html b/tr/docs/develop/nova/foundry_guide/index.html index f28c39e051e..b8bb17f842f 100644 --- a/tr/docs/develop/nova/foundry_guide/index.html +++ b/tr/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/tr/docs/develop/nova/general-information/index.html b/tr/docs/develop/nova/general-information/index.html index 549e4bbc82d..ac1207cdf46 100644 --- a/tr/docs/develop/nova/general-information/index.html +++ b/tr/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/tr/docs/develop/nova/hardhat_guide/index.html b/tr/docs/develop/nova/hardhat_guide/index.html index 1d1e53e049f..c1787eeb8fd 100644 --- a/tr/docs/develop/nova/hardhat_guide/index.html +++ b/tr/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/tr/docs/develop/nova/intro/index.html b/tr/docs/develop/nova/intro/index.html index 019e7f7d2cf..e50e3223f8b 100644 --- a/tr/docs/develop/nova/intro/index.html +++ b/tr/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/tr/docs/develop/nova/local_development/index.html b/tr/docs/develop/nova/local_development/index.html index 32c4d1504e4..e82ff55e913 100644 --- a/tr/docs/develop/nova/local_development/index.html +++ b/tr/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/tr/docs/develop/nova/quick_start/index.html b/tr/docs/develop/nova/quick_start/index.html index e00384d19b3..a07cd9ed3c3 100644 --- a/tr/docs/develop/nova/quick_start/index.html +++ b/tr/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/tr/docs/develop/nova/remix_guide/index.html b/tr/docs/develop/nova/remix_guide/index.html index 99b75a04548..4b5a5c0aae5 100644 --- a/tr/docs/develop/nova/remix_guide/index.html +++ b/tr/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/tr/docs/develop/nova/setting-up-metamask/index.html b/tr/docs/develop/nova/setting-up-metamask/index.html index 9b44756f99e..fef0d14270f 100644 --- a/tr/docs/develop/nova/setting-up-metamask/index.html +++ b/tr/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/tr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 66ec75624b6..7ce9d77e4be 100644 --- a/tr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/tr/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/tr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 1caac5ce3a3..292974288b7 100644 --- a/tr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/tr/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/tr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 30bfeeb5792..98b00aced65 100644 --- a/tr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/tr/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/tr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 41cfc0b8d09..fbb8bfcd593 100644 --- a/tr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/tr/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/tr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index cf647f51229..78b315773bc 100644 --- a/tr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/tr/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/common_problems/index.html b/tr/docs/farming-&-staking/farming/common_problems/index.html index ed5b745b6de..8a08764adda 100644 --- a/tr/docs/farming-&-staking/farming/common_problems/index.html +++ b/tr/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/tr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 7bec1b023a2..8b8f3131dc5 100644 --- a/tr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/tr/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/tr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 4c57accaf61..234b7eae5fa 100644 --- a/tr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/tr/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/tr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 72998d23527..b06729f7b26 100644 --- a/tr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/tr/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/tr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 7f93e973491..2dd2453abf9 100644 --- a/tr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/tr/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/index.html b/tr/docs/farming-&-staking/index.html index f6f04e8ef4e..6a3e4aedef9 100644 --- a/tr/docs/farming-&-staking/index.html +++ b/tr/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/staking/index.html b/tr/docs/farming-&-staking/staking/index.html index a962e7b3484..57cfbedfee6 100644 --- a/tr/docs/farming-&-staking/staking/index.html +++ b/tr/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/staking/intro/index.html b/tr/docs/farming-&-staking/staking/intro/index.html index 5da27fb11b3..80e8a17fa6e 100644 --- a/tr/docs/farming-&-staking/staking/intro/index.html +++ b/tr/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/staking/operators/index.html b/tr/docs/farming-&-staking/staking/operators/index.html index 1c6219ffc76..7021a6d54fe 100644 --- a/tr/docs/farming-&-staking/staking/operators/index.html +++ b/tr/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/timekeeping/index.html b/tr/docs/farming-&-staking/timekeeping/index.html index b24937dc1f1..d3d8ae3c9ae 100644 --- a/tr/docs/farming-&-staking/timekeeping/index.html +++ b/tr/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/wallets/polkadot/index.html b/tr/docs/farming-&-staking/wallets/polkadot/index.html index 8a3f1f779cb..0f3ba37e1df 100644 --- a/tr/docs/farming-&-staking/wallets/polkadot/index.html +++ b/tr/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/tr/docs/farming-&-staking/wallets/subwallet/index.html b/tr/docs/farming-&-staking/wallets/subwallet/index.html index 693afc47b80..c37b376935d 100644 --- a/tr/docs/farming-&-staking/wallets/subwallet/index.html +++ b/tr/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/tr/docs/learn/intro/index.html b/tr/docs/learn/intro/index.html index 1b5afe26618..1d17eccefb5 100644 --- a/tr/docs/learn/intro/index.html +++ b/tr/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/tr/docs/learn/security/index.html b/tr/docs/learn/security/index.html index 190d769a2e1..175262d6b05 100644 --- a/tr/docs/learn/security/index.html +++ b/tr/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/tr/docs/learn/subnomicon/index.html b/tr/docs/learn/subnomicon/index.html index e371b4323c2..e8b20dc598f 100644 --- a/tr/docs/learn/subnomicon/index.html +++ b/tr/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/tr/docs/participate/CODE_OF_CONDUCT/index.html b/tr/docs/participate/CODE_OF_CONDUCT/index.html index 88c08a20d1b..c111e69b4bb 100644 --- a/tr/docs/participate/CODE_OF_CONDUCT/index.html +++ b/tr/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/tr/docs/participate/contribute/index.html b/tr/docs/participate/contribute/index.html index f5ea9dab3d6..cf28c563cfd 100644 --- a/tr/docs/participate/contribute/index.html +++ b/tr/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/tr/docs/participate/index.html b/tr/docs/participate/index.html index 21da05b999e..31a02f3344b 100644 --- a/tr/docs/participate/index.html +++ b/tr/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/tr/docs/participate/translate/index.html b/tr/docs/participate/translate/index.html index 72e00ede008..e4710f2de3b 100644 --- a/tr/docs/participate/translate/index.html +++ b/tr/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/additional-guides/index.html b/tr/docs/pre-release/category/additional-guides/index.html index f8255f9e0df..b04e8ebc0b4 100644 --- a/tr/docs/pre-release/category/additional-guides/index.html +++ b/tr/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/advanced-cli/index.html b/tr/docs/pre-release/category/advanced-cli/index.html index ec60443f6ee..dcc2425cee2 100644 --- a/tr/docs/pre-release/category/advanced-cli/index.html +++ b/tr/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/develop-on-nova-evm-/index.html b/tr/docs/pre-release/category/develop-on-nova-evm-/index.html index a89de0c5fe5..409b222b94d 100644 --- a/tr/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/tr/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/develop/index.html b/tr/docs/pre-release/category/develop/index.html index 9f5ec8c0b23..74902a044a0 100644 --- a/tr/docs/pre-release/category/develop/index.html +++ b/tr/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/farming/index.html b/tr/docs/pre-release/category/farming/index.html index aeb0e27bf8e..e291b57e55d 100644 --- a/tr/docs/pre-release/category/farming/index.html +++ b/tr/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/learn/index.html b/tr/docs/pre-release/category/learn/index.html index d9a99152dc0..448583ffa51 100644 --- a/tr/docs/pre-release/category/learn/index.html +++ b/tr/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/operators-and-nominators/index.html b/tr/docs/pre-release/category/operators-and-nominators/index.html index 22d5d8611a2..f681e492df3 100644 --- a/tr/docs/pre-release/category/operators-and-nominators/index.html +++ b/tr/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/participate/index.html b/tr/docs/pre-release/category/participate/index.html index 5ad78a3a613..c2e52d95dce 100644 --- a/tr/docs/pre-release/category/participate/index.html +++ b/tr/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/pulsar-recommended/index.html b/tr/docs/pre-release/category/pulsar-recommended/index.html index 051142381bb..a5430710090 100644 --- a/tr/docs/pre-release/category/pulsar-recommended/index.html +++ b/tr/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/category/wallets/index.html b/tr/docs/pre-release/category/wallets/index.html index 539eee661dc..d8360d2db06 100644 --- a/tr/docs/pre-release/category/wallets/index.html +++ b/tr/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/block_explorer/index.html b/tr/docs/pre-release/develop/nova/block_explorer/index.html index 3922e1f613d..8df4cd8bcab 100644 --- a/tr/docs/pre-release/develop/nova/block_explorer/index.html +++ b/tr/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/faucet/index.html b/tr/docs/pre-release/develop/nova/faucet/index.html index d907fc66774..db65410ae20 100644 --- a/tr/docs/pre-release/develop/nova/faucet/index.html +++ b/tr/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/foundry_guide/index.html b/tr/docs/pre-release/develop/nova/foundry_guide/index.html index 2482c5e92d3..3e0eedb6da6 100644 --- a/tr/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/tr/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/general-information/index.html b/tr/docs/pre-release/develop/nova/general-information/index.html index 516f96dcb0d..2450b457eee 100644 --- a/tr/docs/pre-release/develop/nova/general-information/index.html +++ b/tr/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/hardhat_guide/index.html b/tr/docs/pre-release/develop/nova/hardhat_guide/index.html index fe3ec354da6..d08f1ba1464 100644 --- a/tr/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/tr/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/intro/index.html b/tr/docs/pre-release/develop/nova/intro/index.html index 7019c99c31d..85858fa24fe 100644 --- a/tr/docs/pre-release/develop/nova/intro/index.html +++ b/tr/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/local_development/index.html b/tr/docs/pre-release/develop/nova/local_development/index.html index 733196ffbb7..05c24a8e57c 100644 --- a/tr/docs/pre-release/develop/nova/local_development/index.html +++ b/tr/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/quick_start/index.html b/tr/docs/pre-release/develop/nova/quick_start/index.html index 79bba6f335a..65284bec0af 100644 --- a/tr/docs/pre-release/develop/nova/quick_start/index.html +++ b/tr/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/remix_guide/index.html b/tr/docs/pre-release/develop/nova/remix_guide/index.html index cce4df23024..8288d1215a4 100644 --- a/tr/docs/pre-release/develop/nova/remix_guide/index.html +++ b/tr/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/develop/nova/setting-up-metamask/index.html b/tr/docs/pre-release/develop/nova/setting-up-metamask/index.html index 40affb8f53a..ccb3b5467b4 100644 --- a/tr/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/tr/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/tr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 2e7d4f19058..4dcc52d1ef5 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index b979c1ed3af..6bcd5c8f126 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 8bcb373f435..aaea3a94529 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index b0fd837af72..15fb6cbfcc3 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index f3798e5a546..1880601ca29 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/tr/docs/pre-release/farming-&-staking/farming/common_problems/index.html index f90165d742c..c5ac73cf4bf 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index cddd6064591..97f1ec7747d 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 4bd11e0db9d..c7d8a5147c0 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index b819ea31554..4e0e090411e 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 1df5cdc1b3c..f8276d66b67 100644 --- a/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/tr/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/index.html b/tr/docs/pre-release/farming-&-staking/index.html index 6eba1a3a680..1f14a052c2f 100644 --- a/tr/docs/pre-release/farming-&-staking/index.html +++ b/tr/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/staking/index.html b/tr/docs/pre-release/farming-&-staking/staking/index.html index 91ca3f2cd05..78213011742 100644 --- a/tr/docs/pre-release/farming-&-staking/staking/index.html +++ b/tr/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/staking/intro/index.html b/tr/docs/pre-release/farming-&-staking/staking/intro/index.html index 1ca62ff50c1..26d727fddee 100644 --- a/tr/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/tr/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/staking/operators/index.html b/tr/docs/pre-release/farming-&-staking/staking/operators/index.html index 5141a01278b..f5e00ec1249 100644 --- a/tr/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/tr/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/timekeeping/index.html b/tr/docs/pre-release/farming-&-staking/timekeeping/index.html index e844c2acc15..c4fe617a129 100644 --- a/tr/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/tr/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/tr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 75b763ebdcd..099cf37cd22 100644 --- a/tr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/tr/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/tr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index 77ef687cec8..a1b6b7c1ccb 100644 --- a/tr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/tr/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/learn/intro/index.html b/tr/docs/pre-release/learn/intro/index.html index cdb74eaa6a5..78148b9df29 100644 --- a/tr/docs/pre-release/learn/intro/index.html +++ b/tr/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/learn/security/index.html b/tr/docs/pre-release/learn/security/index.html index c6fb7b17a94..a2427ac770c 100644 --- a/tr/docs/pre-release/learn/security/index.html +++ b/tr/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/learn/subnomicon/index.html b/tr/docs/pre-release/learn/subnomicon/index.html index 7a342b493ad..8779ce76f60 100644 --- a/tr/docs/pre-release/learn/subnomicon/index.html +++ b/tr/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/tr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index 55b0f0867ee..6550cac1bec 100644 --- a/tr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/tr/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/participate/contribute/index.html b/tr/docs/pre-release/participate/contribute/index.html index 9c5ecb7aaed..240c695a159 100644 --- a/tr/docs/pre-release/participate/contribute/index.html +++ b/tr/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/tr/docs/pre-release/participate/index.html b/tr/docs/pre-release/participate/index.html index 7df28a0ef0b..f2209d861ce 100644 --- a/tr/docs/pre-release/participate/index.html +++ b/tr/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/tr/docs/pre-release/participate/translate/index.html b/tr/docs/pre-release/participate/translate/index.html index 9d910c4e66c..29e3d2c3f91 100644 --- a/tr/docs/pre-release/participate/translate/index.html +++ b/tr/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/tr/index.html b/tr/index.html index 3af51dafba6..d125ca98284 100644 --- a/tr/index.html +++ b/tr/index.html @@ -7,13 +7,13 @@ - +

    Her Yerden Çiftlik

    Yedek disk taahhüt ederek bir çiftçi düğümü çalıştırarak ödüller kazanın. Pahalı bir kurulum veya peşin sermaye gerekli değildir.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/tr/markdown-page/index.html b/tr/markdown-page/index.html index aa616f605c1..e01fd060d84 100644 --- a/tr/markdown-page/index.html +++ b/tr/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/404.html b/uk/404.html index 98a49f6441d..2f19e596edf 100644 --- a/uk/404.html +++ b/uk/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/assets/js/37dd1878.d9621afb.js b/uk/assets/js/37dd1878.d9621afb.js new file mode 100644 index 00000000000..3fada1ea5c5 --- /dev/null +++ b/uk/assets/js/37dd1878.d9621afb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[1613],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5170:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/uk/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/uk/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/uk/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/uk/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/uk/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/uk/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/uk/assets/js/37dd1878.f075ac6a.js b/uk/assets/js/37dd1878.f075ac6a.js deleted file mode 100644 index 5e6b183e8c4..00000000000 --- a/uk/assets/js/37dd1878.f075ac6a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[1613],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},5170:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/uk/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/uk/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/uk/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/uk/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/uk/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/uk/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/uk/assets/js/3bfe2ea2.073b2203.js b/uk/assets/js/3bfe2ea2.073b2203.js deleted file mode 100644 index c2410e9cbae..00000000000 --- a/uk/assets/js/3bfe2ea2.073b2203.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5187],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},4083:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/uk/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/uk/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/uk/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/uk/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/uk/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/uk/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/uk/assets/js/3bfe2ea2.459a30cd.js b/uk/assets/js/3bfe2ea2.459a30cd.js new file mode 100644 index 00000000000..6997660fb71 --- /dev/null +++ b/uk/assets/js/3bfe2ea2.459a30cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[5187],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},4083:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/uk/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/uk/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/uk/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/uk/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/uk/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/uk/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/uk/assets/js/runtime~main.1557a526.js b/uk/assets/js/runtime~main.46eac445.js similarity index 98% rename from uk/assets/js/runtime~main.1557a526.js rename to uk/assets/js/runtime~main.46eac445.js index a269980c896..0843c5b590e 100644 --- a/uk/assets/js/runtime~main.1557a526.js +++ b/uk/assets/js/runtime~main.46eac445.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return b[e].call(c.exports,c,c.exports,r),c.exports}r.m=b,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",93:"6ced23bc",167:"9f535f51",335:"3334a6ef",370:"f7eca45c",486:"a735ba09",646:"25e8c0bf",678:"a3b94e10",699:"6dacefb5",733:"9015368b",863:"b2065874",895:"4f228981",974:"200600e4",1164:"4ba4090f",1183:"9e409b68",1318:"200cdc03",1514:"417a94e3",1613:"37dd1878",1738:"4ea7ecb7",1752:"8a04401f",1826:"0e9ca406",1953:"d1101eb4",2239:"a1e3d9aa",2303:"e918e14c",2411:"d2ea7a0d",2442:"8f1fe180",2559:"4c59824d",2579:"180c56a3",2800:"6be12e54",3085:"1f391b9e",3149:"112bb34d",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3746:"b2fecc7f",3782:"8da87d17",3921:"92f1a965",4148:"2aebd4d0",4307:"a06834f0",4318:"2de1d4d2",4419:"168584be",4553:"6cf26727",4826:"fcf0b28e",5062:"e14c99be",5127:"26835d1c",5187:"3bfe2ea2",5298:"d60c5d6b",5317:"184a0d59",5390:"032cbfc4",5440:"c82e7b4d",5498:"0a941854",5564:"156d957a",5634:"1b157153",6193:"f172c634",6277:"c6d9c046",6370:"04ac6656",6376:"35931383",6427:"1a7ae86f",6429:"f0454e0d",6604:"c05e3f87",6852:"3328eee9",6853:"2ea3291d",6859:"32c6d4de",7147:"c37c0886",7184:"7106ab10",7327:"c6aee7c6",7370:"c09f4ff7",7414:"393be207",7424:"58411b4c",7567:"eaa6bacb",7621:"6eae28d2",7774:"bc11d41e",7858:"7de63644",7918:"17896441",7936:"58c08bbf",8070:"8386fcfc",8093:"3d2f6f74",8236:"93605d74",8670:"f53a9903",8709:"72bcbd74",8956:"9d409e72",8963:"d48b944c",9019:"d4479f95",9065:"79c568f5",9121:"87ed99ec",9158:"f9f9c002",9166:"b4666c18",9189:"f6c32665",9507:"08d52c66",9514:"1be78505",9579:"3a61dee7",9582:"20478dee",9592:"3e0b541e",9679:"708ec1fa",9746:"3ef6204a",9817:"14eb3368",9848:"ea5513bc",9947:"7737afc6"}[e]||e)+"."+{53:"591dbc3e",93:"6a21e703",167:"f20f0b4a",335:"62c7cd69",370:"34074764",486:"209949db",646:"34acd8f2",678:"623454ae",699:"eb3bbc91",733:"13eaadcc",814:"dc8c3a26",863:"bf2be1fa",895:"d22f3ede",974:"0f2eb6aa",1164:"22ac4eee",1183:"f472ffef",1318:"ff8c37a1",1514:"46f382ff",1613:"f075ac6a",1738:"4e37699d",1752:"eda368ea",1826:"fb08dcbd",1953:"cdec3a82",2239:"02f7b5bb",2303:"d523b722",2411:"d6e89fc1",2442:"e2725f24",2559:"19b7104c",2579:"864c1e67",2800:"5deb9188",3085:"3a447380",3149:"a43052cf",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3473:"fdffa07c",3746:"998e0e60",3782:"24596172",3921:"d881a775",4148:"d9a485be",4307:"b65e612f",4318:"2c352e3e",4419:"d2b4b5a7",4553:"c9a00c49",4826:"28e16cad",4972:"4a54fd4a",5062:"8f32656e",5127:"db959801",5187:"073b2203",5298:"be98fff2",5317:"f32597b1",5390:"4d351e6c",5440:"1e3894b3",5498:"fd88fb3e",5564:"6a507581",5634:"be42222e",6193:"f28c05ac",6277:"e2e972e8",6370:"9ef2911d",6376:"850893f0",6427:"9eaa4c3a",6429:"84b06664",6604:"3d7dad3d",6852:"fd046de3",6853:"79d15280",6859:"87f49a47",7147:"ba477db2",7184:"461e1142",7327:"fb57691a",7370:"81d78b99",7414:"67226c8f",7424:"a8ca31f9",7567:"18ff4c30",7621:"7dc9d069",7774:"0c1fe9e6",7858:"ef7b974a",7918:"e3da5265",7936:"4b4c6c2e",8070:"0166b945",8093:"29bf73e7",8236:"dd03d432",8670:"48b019ad",8709:"1f115d35",8956:"9bd5c571",8963:"68d63624",9019:"3421d4eb",9065:"4f5d4bc1",9121:"f5fea898",9158:"89cfe4bf",9166:"918baacc",9189:"86993c2d",9507:"4970970f",9514:"478c02c6",9579:"e222614e",9582:"de074b4e",9592:"a8b5138d",9679:"985f6b9e",9746:"478a52f0",9817:"b7ea7ab7",9848:"8b479845",9947:"2295115f"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="portal:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/uk/",r.gca=function(e){return e={17896441:"7918",35931383:"6376","935f2afb":"53","6ced23bc":"93","9f535f51":"167","3334a6ef":"335",f7eca45c:"370",a735ba09:"486","25e8c0bf":"646",a3b94e10:"678","6dacefb5":"699","9015368b":"733",b2065874:"863","4f228981":"895","200600e4":"974","4ba4090f":"1164","9e409b68":"1183","200cdc03":"1318","417a94e3":"1514","37dd1878":"1613","4ea7ecb7":"1738","8a04401f":"1752","0e9ca406":"1826",d1101eb4:"1953",a1e3d9aa:"2239",e918e14c:"2303",d2ea7a0d:"2411","8f1fe180":"2442","4c59824d":"2559","180c56a3":"2579","6be12e54":"2800","1f391b9e":"3085","112bb34d":"3149",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",b2fecc7f:"3746","8da87d17":"3782","92f1a965":"3921","2aebd4d0":"4148",a06834f0:"4307","2de1d4d2":"4318","168584be":"4419","6cf26727":"4553",fcf0b28e:"4826",e14c99be:"5062","26835d1c":"5127","3bfe2ea2":"5187",d60c5d6b:"5298","184a0d59":"5317","032cbfc4":"5390",c82e7b4d:"5440","0a941854":"5498","156d957a":"5564","1b157153":"5634",f172c634:"6193",c6d9c046:"6277","04ac6656":"6370","1a7ae86f":"6427",f0454e0d:"6429",c05e3f87:"6604","3328eee9":"6852","2ea3291d":"6853","32c6d4de":"6859",c37c0886:"7147","7106ab10":"7184",c6aee7c6:"7327",c09f4ff7:"7370","393be207":"7414","58411b4c":"7424",eaa6bacb:"7567","6eae28d2":"7621",bc11d41e:"7774","7de63644":"7858","58c08bbf":"7936","8386fcfc":"8070","3d2f6f74":"8093","93605d74":"8236",f53a9903:"8670","72bcbd74":"8709","9d409e72":"8956",d48b944c:"8963",d4479f95:"9019","79c568f5":"9065","87ed99ec":"9121",f9f9c002:"9158",b4666c18:"9166",f6c32665:"9189","08d52c66":"9507","1be78505":"9514","3a61dee7":"9579","20478dee":"9582","3e0b541e":"9592","708ec1fa":"9679","3ef6204a":"9746","14eb3368":"9817",ea5513bc:"9848","7737afc6":"9947"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return b[e].call(c.exports,c,c.exports,r),c.exports}r.m=b,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",93:"6ced23bc",167:"9f535f51",335:"3334a6ef",370:"f7eca45c",486:"a735ba09",646:"25e8c0bf",678:"a3b94e10",699:"6dacefb5",733:"9015368b",863:"b2065874",895:"4f228981",974:"200600e4",1164:"4ba4090f",1183:"9e409b68",1318:"200cdc03",1514:"417a94e3",1613:"37dd1878",1738:"4ea7ecb7",1752:"8a04401f",1826:"0e9ca406",1953:"d1101eb4",2239:"a1e3d9aa",2303:"e918e14c",2411:"d2ea7a0d",2442:"8f1fe180",2559:"4c59824d",2579:"180c56a3",2800:"6be12e54",3085:"1f391b9e",3149:"112bb34d",3235:"da6f36cd",3237:"1df93b7f",3280:"ef42b41f",3746:"b2fecc7f",3782:"8da87d17",3921:"92f1a965",4148:"2aebd4d0",4307:"a06834f0",4318:"2de1d4d2",4419:"168584be",4553:"6cf26727",4826:"fcf0b28e",5062:"e14c99be",5127:"26835d1c",5187:"3bfe2ea2",5298:"d60c5d6b",5317:"184a0d59",5390:"032cbfc4",5440:"c82e7b4d",5498:"0a941854",5564:"156d957a",5634:"1b157153",6193:"f172c634",6277:"c6d9c046",6370:"04ac6656",6376:"35931383",6427:"1a7ae86f",6429:"f0454e0d",6604:"c05e3f87",6852:"3328eee9",6853:"2ea3291d",6859:"32c6d4de",7147:"c37c0886",7184:"7106ab10",7327:"c6aee7c6",7370:"c09f4ff7",7414:"393be207",7424:"58411b4c",7567:"eaa6bacb",7621:"6eae28d2",7774:"bc11d41e",7858:"7de63644",7918:"17896441",7936:"58c08bbf",8070:"8386fcfc",8093:"3d2f6f74",8236:"93605d74",8670:"f53a9903",8709:"72bcbd74",8956:"9d409e72",8963:"d48b944c",9019:"d4479f95",9065:"79c568f5",9121:"87ed99ec",9158:"f9f9c002",9166:"b4666c18",9189:"f6c32665",9507:"08d52c66",9514:"1be78505",9579:"3a61dee7",9582:"20478dee",9592:"3e0b541e",9679:"708ec1fa",9746:"3ef6204a",9817:"14eb3368",9848:"ea5513bc",9947:"7737afc6"}[e]||e)+"."+{53:"591dbc3e",93:"6a21e703",167:"f20f0b4a",335:"62c7cd69",370:"34074764",486:"209949db",646:"34acd8f2",678:"623454ae",699:"eb3bbc91",733:"13eaadcc",814:"dc8c3a26",863:"bf2be1fa",895:"d22f3ede",974:"0f2eb6aa",1164:"22ac4eee",1183:"f472ffef",1318:"ff8c37a1",1514:"46f382ff",1613:"d9621afb",1738:"4e37699d",1752:"eda368ea",1826:"fb08dcbd",1953:"cdec3a82",2239:"02f7b5bb",2303:"d523b722",2411:"d6e89fc1",2442:"e2725f24",2559:"19b7104c",2579:"864c1e67",2800:"5deb9188",3085:"3a447380",3149:"a43052cf",3203:"c0b8bfe8",3235:"4cee896d",3237:"b8ec0c1b",3280:"a28d7ef7",3473:"fdffa07c",3746:"998e0e60",3782:"24596172",3921:"d881a775",4148:"d9a485be",4307:"b65e612f",4318:"2c352e3e",4419:"d2b4b5a7",4553:"c9a00c49",4826:"28e16cad",4972:"4a54fd4a",5062:"8f32656e",5127:"db959801",5187:"459a30cd",5298:"be98fff2",5317:"f32597b1",5390:"4d351e6c",5440:"1e3894b3",5498:"fd88fb3e",5564:"6a507581",5634:"be42222e",6193:"f28c05ac",6277:"e2e972e8",6370:"9ef2911d",6376:"850893f0",6427:"9eaa4c3a",6429:"84b06664",6604:"3d7dad3d",6852:"fd046de3",6853:"79d15280",6859:"87f49a47",7147:"ba477db2",7184:"461e1142",7327:"fb57691a",7370:"81d78b99",7414:"67226c8f",7424:"a8ca31f9",7567:"18ff4c30",7621:"7dc9d069",7774:"0c1fe9e6",7858:"ef7b974a",7918:"e3da5265",7936:"4b4c6c2e",8070:"0166b945",8093:"29bf73e7",8236:"dd03d432",8670:"48b019ad",8709:"1f115d35",8956:"9bd5c571",8963:"68d63624",9019:"3421d4eb",9065:"4f5d4bc1",9121:"f5fea898",9158:"89cfe4bf",9166:"918baacc",9189:"86993c2d",9507:"4970970f",9514:"478c02c6",9579:"e222614e",9582:"de074b4e",9592:"a8b5138d",9679:"985f6b9e",9746:"478a52f0",9817:"b7ea7ab7",9848:"8b479845",9947:"2295115f"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="portal:",r.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/uk/",r.gca=function(e){return e={17896441:"7918",35931383:"6376","935f2afb":"53","6ced23bc":"93","9f535f51":"167","3334a6ef":"335",f7eca45c:"370",a735ba09:"486","25e8c0bf":"646",a3b94e10:"678","6dacefb5":"699","9015368b":"733",b2065874:"863","4f228981":"895","200600e4":"974","4ba4090f":"1164","9e409b68":"1183","200cdc03":"1318","417a94e3":"1514","37dd1878":"1613","4ea7ecb7":"1738","8a04401f":"1752","0e9ca406":"1826",d1101eb4:"1953",a1e3d9aa:"2239",e918e14c:"2303",d2ea7a0d:"2411","8f1fe180":"2442","4c59824d":"2559","180c56a3":"2579","6be12e54":"2800","1f391b9e":"3085","112bb34d":"3149",da6f36cd:"3235","1df93b7f":"3237",ef42b41f:"3280",b2fecc7f:"3746","8da87d17":"3782","92f1a965":"3921","2aebd4d0":"4148",a06834f0:"4307","2de1d4d2":"4318","168584be":"4419","6cf26727":"4553",fcf0b28e:"4826",e14c99be:"5062","26835d1c":"5127","3bfe2ea2":"5187",d60c5d6b:"5298","184a0d59":"5317","032cbfc4":"5390",c82e7b4d:"5440","0a941854":"5498","156d957a":"5564","1b157153":"5634",f172c634:"6193",c6d9c046:"6277","04ac6656":"6370","1a7ae86f":"6427",f0454e0d:"6429",c05e3f87:"6604","3328eee9":"6852","2ea3291d":"6853","32c6d4de":"6859",c37c0886:"7147","7106ab10":"7184",c6aee7c6:"7327",c09f4ff7:"7370","393be207":"7414","58411b4c":"7424",eaa6bacb:"7567","6eae28d2":"7621",bc11d41e:"7774","7de63644":"7858","58c08bbf":"7936","8386fcfc":"8070","3d2f6f74":"8093","93605d74":"8236",f53a9903:"8670","72bcbd74":"8709","9d409e72":"8956",d48b944c:"8963",d4479f95:"9019","79c568f5":"9065","87ed99ec":"9121",f9f9c002:"9158",b4666c18:"9166",f6c32665:"9189","08d52c66":"9507","1be78505":"9514","3a61dee7":"9579","20478dee":"9582","3e0b541e":"9592","708ec1fa":"9679","3ef6204a":"9746","14eb3368":"9817",ea5513bc:"9848","7737afc6":"9947"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n - + - + \ No newline at end of file diff --git a/uk/docs/category/advanced-cli/index.html b/uk/docs/category/advanced-cli/index.html index 06827ec602e..4ddfc0a7593 100644 --- a/uk/docs/category/advanced-cli/index.html +++ b/uk/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/category/develop-on-nova-evm-/index.html b/uk/docs/category/develop-on-nova-evm-/index.html index 1a972cbc0b9..e74dfc8f11b 100644 --- a/uk/docs/category/develop-on-nova-evm-/index.html +++ b/uk/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/uk/docs/category/develop/index.html b/uk/docs/category/develop/index.html index 10c0f7e1375..0daab4f7661 100644 --- a/uk/docs/category/develop/index.html +++ b/uk/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/category/farming/index.html b/uk/docs/category/farming/index.html index e8842ff1930..2bdc9c9c3ee 100644 --- a/uk/docs/category/farming/index.html +++ b/uk/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/category/learn/index.html b/uk/docs/category/learn/index.html index d1f29ccca65..3522df545b3 100644 --- a/uk/docs/category/learn/index.html +++ b/uk/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/category/operators-and-nominators/index.html b/uk/docs/category/operators-and-nominators/index.html index 711cb75e632..26f6fb08a81 100644 --- a/uk/docs/category/operators-and-nominators/index.html +++ b/uk/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/category/participate/index.html b/uk/docs/category/participate/index.html index 5bd7d29f770..9d66b169937 100644 --- a/uk/docs/category/participate/index.html +++ b/uk/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/category/pulsar-recommended/index.html b/uk/docs/category/pulsar-recommended/index.html index 081919cc347..ebbf8b2f596 100644 --- a/uk/docs/category/pulsar-recommended/index.html +++ b/uk/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/category/wallets/index.html b/uk/docs/category/wallets/index.html index 363945b650a..cce88863e85 100644 --- a/uk/docs/category/wallets/index.html +++ b/uk/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/develop/nova/block_explorer/index.html b/uk/docs/develop/nova/block_explorer/index.html index a5b13896525..f1a83543793 100644 --- a/uk/docs/develop/nova/block_explorer/index.html +++ b/uk/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/develop/nova/faucet/index.html b/uk/docs/develop/nova/faucet/index.html index 5527efe5e8d..d8fbdb147d5 100644 --- a/uk/docs/develop/nova/faucet/index.html +++ b/uk/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/uk/docs/develop/nova/foundry_guide/index.html b/uk/docs/develop/nova/foundry_guide/index.html index 3bef7831138..8c5923608d7 100644 --- a/uk/docs/develop/nova/foundry_guide/index.html +++ b/uk/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/uk/docs/develop/nova/general-information/index.html b/uk/docs/develop/nova/general-information/index.html index 588166cf0a4..0291212a8a6 100644 --- a/uk/docs/develop/nova/general-information/index.html +++ b/uk/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/uk/docs/develop/nova/hardhat_guide/index.html b/uk/docs/develop/nova/hardhat_guide/index.html index 0b9d3c3dbd3..17e56b79713 100644 --- a/uk/docs/develop/nova/hardhat_guide/index.html +++ b/uk/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/uk/docs/develop/nova/intro/index.html b/uk/docs/develop/nova/intro/index.html index be1d139a120..efb1b064c51 100644 --- a/uk/docs/develop/nova/intro/index.html +++ b/uk/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/uk/docs/develop/nova/local_development/index.html b/uk/docs/develop/nova/local_development/index.html index 98ec97998b9..996e571186e 100644 --- a/uk/docs/develop/nova/local_development/index.html +++ b/uk/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/uk/docs/develop/nova/quick_start/index.html b/uk/docs/develop/nova/quick_start/index.html index 021626487b1..d1c21acfd8c 100644 --- a/uk/docs/develop/nova/quick_start/index.html +++ b/uk/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/uk/docs/develop/nova/remix_guide/index.html b/uk/docs/develop/nova/remix_guide/index.html index a4ec022f5a3..9927d0e7a70 100644 --- a/uk/docs/develop/nova/remix_guide/index.html +++ b/uk/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/uk/docs/develop/nova/setting-up-metamask/index.html b/uk/docs/develop/nova/setting-up-metamask/index.html index 3e86b3a22ef..ee12f757e76 100644 --- a/uk/docs/develop/nova/setting-up-metamask/index.html +++ b/uk/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/uk/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 411a242cf6f..2e38f149f46 100644 --- a/uk/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/uk/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/uk/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 2660e267f1b..f957b3b4f7b 100644 --- a/uk/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/uk/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/uk/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index 824bc4625f5..1582a3e562a 100644 --- a/uk/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/uk/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/uk/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index bbb2a1abef4..5a66ba1ae43 100644 --- a/uk/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/uk/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/uk/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 94f5eec8f70..3a89948daeb 100644 --- a/uk/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/uk/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/common_problems/index.html b/uk/docs/farming-&-staking/farming/common_problems/index.html index 2f9ee8e9c56..b41c3103c05 100644 --- a/uk/docs/farming-&-staking/farming/common_problems/index.html +++ b/uk/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/uk/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 76efa49b045..cf2c22436fc 100644 --- a/uk/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/uk/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/uk/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 506772321cf..e3dadc1aa8a 100644 --- a/uk/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/uk/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: latest

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/uk/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 307d485ffdf..e7045e07581 100644 --- a/uk/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/uk/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/uk/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 73119444988..332b385d1f9 100644 --- a/uk/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/uk/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/index.html b/uk/docs/farming-&-staking/index.html index 94156103a18..bae40c4ebe6 100644 --- a/uk/docs/farming-&-staking/index.html +++ b/uk/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/staking/index.html b/uk/docs/farming-&-staking/staking/index.html index 670e90cf16a..fd837457122 100644 --- a/uk/docs/farming-&-staking/staking/index.html +++ b/uk/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/staking/intro/index.html b/uk/docs/farming-&-staking/staking/intro/index.html index cb38708cb4a..b8fb0d653e1 100644 --- a/uk/docs/farming-&-staking/staking/intro/index.html +++ b/uk/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/staking/operators/index.html b/uk/docs/farming-&-staking/staking/operators/index.html index a48fa568fa7..063cb3044bc 100644 --- a/uk/docs/farming-&-staking/staking/operators/index.html +++ b/uk/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/timekeeping/index.html b/uk/docs/farming-&-staking/timekeeping/index.html index 73103f894eb..3f4561bb84d 100644 --- a/uk/docs/farming-&-staking/timekeeping/index.html +++ b/uk/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/wallets/polkadot/index.html b/uk/docs/farming-&-staking/wallets/polkadot/index.html index a83f75d268f..f749a612974 100644 --- a/uk/docs/farming-&-staking/wallets/polkadot/index.html +++ b/uk/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/uk/docs/farming-&-staking/wallets/subwallet/index.html b/uk/docs/farming-&-staking/wallets/subwallet/index.html index 41b8ec16265..612b2965177 100644 --- a/uk/docs/farming-&-staking/wallets/subwallet/index.html +++ b/uk/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/uk/docs/learn/intro/index.html b/uk/docs/learn/intro/index.html index f88b6d0a48a..ecdf21f8b84 100644 --- a/uk/docs/learn/intro/index.html +++ b/uk/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/uk/docs/learn/security/index.html b/uk/docs/learn/security/index.html index 2ec49e3985a..03104ec8d16 100644 --- a/uk/docs/learn/security/index.html +++ b/uk/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/uk/docs/learn/subnomicon/index.html b/uk/docs/learn/subnomicon/index.html index 9bd6341bbfb..8f70e601883 100644 --- a/uk/docs/learn/subnomicon/index.html +++ b/uk/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/uk/docs/participate/CODE_OF_CONDUCT/index.html b/uk/docs/participate/CODE_OF_CONDUCT/index.html index 61160b707fc..44479efc7cb 100644 --- a/uk/docs/participate/CODE_OF_CONDUCT/index.html +++ b/uk/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/uk/docs/participate/contribute/index.html b/uk/docs/participate/contribute/index.html index 54ac6cce528..cd177bb0997 100644 --- a/uk/docs/participate/contribute/index.html +++ b/uk/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/uk/docs/participate/index.html b/uk/docs/participate/index.html index b11c939f505..56e08208f88 100644 --- a/uk/docs/participate/index.html +++ b/uk/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/uk/docs/participate/translate/index.html b/uk/docs/participate/translate/index.html index 3f5a25fd6fd..f050d37f50e 100644 --- a/uk/docs/participate/translate/index.html +++ b/uk/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: latest

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/additional-guides/index.html b/uk/docs/pre-release/category/additional-guides/index.html index d237cf423d4..de7ffd05bb8 100644 --- a/uk/docs/pre-release/category/additional-guides/index.html +++ b/uk/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/advanced-cli/index.html b/uk/docs/pre-release/category/advanced-cli/index.html index cb26c52992b..890ec0ad278 100644 --- a/uk/docs/pre-release/category/advanced-cli/index.html +++ b/uk/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/develop-on-nova-evm-/index.html b/uk/docs/pre-release/category/develop-on-nova-evm-/index.html index 74e9151edfd..55d44734a22 100644 --- a/uk/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/uk/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/develop/index.html b/uk/docs/pre-release/category/develop/index.html index 834ae3fa9af..8bf36cafcf0 100644 --- a/uk/docs/pre-release/category/develop/index.html +++ b/uk/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/farming/index.html b/uk/docs/pre-release/category/farming/index.html index a09a840c0ea..5f10ee45cfe 100644 --- a/uk/docs/pre-release/category/farming/index.html +++ b/uk/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/learn/index.html b/uk/docs/pre-release/category/learn/index.html index dc005644a71..b0d0ff3abf1 100644 --- a/uk/docs/pre-release/category/learn/index.html +++ b/uk/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/operators-and-nominators/index.html b/uk/docs/pre-release/category/operators-and-nominators/index.html index 254fb1f016a..f88080e90c8 100644 --- a/uk/docs/pre-release/category/operators-and-nominators/index.html +++ b/uk/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/participate/index.html b/uk/docs/pre-release/category/participate/index.html index 265553c3b1c..4a6dee0e2a1 100644 --- a/uk/docs/pre-release/category/participate/index.html +++ b/uk/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/pulsar-recommended/index.html b/uk/docs/pre-release/category/pulsar-recommended/index.html index b182438c334..a0e08c72f83 100644 --- a/uk/docs/pre-release/category/pulsar-recommended/index.html +++ b/uk/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/category/wallets/index.html b/uk/docs/pre-release/category/wallets/index.html index e13d5aba3d0..6b5c7829286 100644 --- a/uk/docs/pre-release/category/wallets/index.html +++ b/uk/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/block_explorer/index.html b/uk/docs/pre-release/develop/nova/block_explorer/index.html index 488c7dfb9f5..b53de4aa81b 100644 --- a/uk/docs/pre-release/develop/nova/block_explorer/index.html +++ b/uk/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Subspace block explorer

    Subspace Block Explorer

    Block explorer link

    This early version provides a clear and user-friendly visualization of Subspace-specific statistics that cater to the needs of our farmers and developers.

    On the top of the page, you can easily toggle between all available networks and EVM.

    BlockExplorer-1

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/faucet/index.html b/uk/docs/pre-release/develop/nova/faucet/index.html index 9d50e66f1b8..e40c769fb72 100644 --- a/uk/docs/pre-release/develop/nova/faucet/index.html +++ b/uk/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/foundry_guide/index.html b/uk/docs/pre-release/develop/nova/foundry_guide/index.html index 016b94d394d..01bacb99935 100644 --- a/uk/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/uk/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/general-information/index.html b/uk/docs/pre-release/develop/nova/general-information/index.html index 9726fea8f1e..ecb058dbfba 100644 --- a/uk/docs/pre-release/develop/nova/general-information/index.html +++ b/uk/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/hardhat_guide/index.html b/uk/docs/pre-release/develop/nova/hardhat_guide/index.html index 0224de18ab4..425c466d612 100644 --- a/uk/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/uk/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/intro/index.html b/uk/docs/pre-release/develop/nova/intro/index.html index 86d0246ce97..893fad73183 100644 --- a/uk/docs/pre-release/develop/nova/intro/index.html +++ b/uk/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/local_development/index.html b/uk/docs/pre-release/develop/nova/local_development/index.html index ffe7e9ed6a9..eb419e68eeb 100644 --- a/uk/docs/pre-release/develop/nova/local_development/index.html +++ b/uk/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/quick_start/index.html b/uk/docs/pre-release/develop/nova/quick_start/index.html index 613896b6e27..ab43f1fb6c8 100644 --- a/uk/docs/pre-release/develop/nova/quick_start/index.html +++ b/uk/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/remix_guide/index.html b/uk/docs/pre-release/develop/nova/remix_guide/index.html index 1e380c13d73..f44daa7669c 100644 --- a/uk/docs/pre-release/develop/nova/remix_guide/index.html +++ b/uk/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/develop/nova/setting-up-metamask/index.html b/uk/docs/pre-release/develop/nova/setting-up-metamask/index.html index c03a95dae85..d9993287b2a 100644 --- a/uk/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/uk/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/uk/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index d0d445bb4d1..647afa7a7d8 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. This will display the IP Address of your home router at the top
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. Some ISP's have it configured to your ISP Portal account login information.

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index fbf813f2a0f..ece35c48f97 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -24,7 +24,7 @@ Remember to change the username if setting up the node from a regular user:

    Systemd Service File Generator

    subspace-node.service

    subspace-farmer.service

    Open the Node Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-node.service

    Open the Farmer Service File and Paste the Corresponding Generated Content:

    EDITOR=nano sudo -e /etc/systemd/system/subspace-farmer.service

    Enable and Start the Node and Farmer:

    sudo systemctl enable --now subspace-{node,farmer}

    Useful Commands

    Start Node:

    sudo systemctl start subspace-node

    Start Farmer:

    sudo systemctl start subspace-farmer

    Stop Node:

    sudo systemctl stop subspace-node

    Stop Farmer:

    sudo systemctl stop subspace-farmer

    Enable Node (for automatic startup on system boot):

    sudo systemctl enable subspace-node

    Enable Farmer (for automatic startup on system boot):

    sudo systemctl enable subspace-farmer

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-node

    Disable Node (to prevent automatic startup on system boot):

    sudo systemctl disable subspace-farmer

    Check Node Service Status:

    sudo systemctl status subspace-node

    Check Farmer Service Status:

    sudo systemctl status subspace-farmer

    View Node Logs:

    sudo journalctl -f -o cat -u subspace-node

    View Farmer Logs:

    sudo journalctl -f -o cat -u subspace-farmer

    Count Farmer Rewards Received in the Last Hour:

    sudo journalctl -o cat -u subspace-farmer --since="1 hour ago" | grep -i "Successfully signed reward hash" | wc -l

    Upgrade

    To upgrade a node and farmer, first, stop running services:

    sudo systemctl stop subspace-{node,farmer}

    After using the commands from the beginning of the manual, download the executable files of the new release. And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index f79ed29b011..998edb308e0 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 87f4f2505dd..1e8a33680bc 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Using a Custom Path

    You can set a custom path for your node & farmer to use if you want to use an external hard drive, or set a custom path from the default. You can set the node and farmer to different directories if you would like.

    #### Set Node Custom Path.
    To set your node to use a custom path all you will need to do is add the `--base-path` parameter.

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    Switching to a new snapshot from older/different versions of Subspace

    info

    Unless specifically mentioned by the Development team you should NOT have to wipe & purge your configuration on new releases.

    In general you should be able to download the latest release, and re-start the Node & Farmer with the same commands as you started to prior version with no errors.

    There are some cases where version updates will cause issue with your Node & Farmer and you may have to wipe & purge your node, typically when errors occur. If you have any issues you can always check our Forums and hop in our Discord Server to ask for help.

    Help

    There are extra commands and parameters you can use on farmer or node, use the --help after any other command to display additional options.

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    Example:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index 8207c2a2276..1230c75f0a2 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe & Purge

    If you were running a node previously, and want to switch to a new snapshot, please perform these steps and then follow the guideline again:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    Does not matter if the node/farmer executable is the previous one or from the new snapshot, both will work :) The reason we require this is, with every snapshot change, the network might get partitioned, and you may be on a different genesis than the current one. In plain English, these commands are like a reset button for snapshot changes.

    Now follow installation guide.

    Docker Wipe & Purge

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    Now follow installation guide.

    If you are having some issues with running the node or the farmer for the subspace network, feel free to join our Discord or even better you can take a look at our Forums and review and existing questions or post a new one if needed!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/uk/docs/pre-release/farming-&-staking/farming/common_problems/index.html index 1959754a7e9..05f1c8fb1ea 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 2683a2a7a77..e30524d859f 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ While this memory can be readily freed when necessary, Windows occasionally may not display these allocations accurately due to certain system nuances. High RAM consumption should not be a cause for concern.

    Windows No Output Bug

    If you face an error where the node outputs nothing and no error code is given it is likely you just need to install the latest Visual C++ Redistributable package here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. This will prompt you to setup your Pulsar configurations to begin farming. You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    danger

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index abc5837c349..59f11ee5d5c 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    Version: Pre-Release

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    Crypto Wallet

    Before running anything you need to have a wallet where you'll receive testnet coins. There are currently two wallets we suggest using, SubWallet being the preferred route.

    Install one of the two wallets above into your browser and create a new account there. The address of your account will be necessary at the last step.

    For help refer to our forum post How to setup Subwallet & a Polkadot.js Wallet

    • make sure to follow the Bonus section of the bottom of the post above.

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index be8d839080c..6ef5cc1aec8 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    If you want to learn more about Tmux and its options check out their Repo [here](https://github.com/tmux/tmux/wiki)

    :::

    * Create a new tmux session using a socket file named farming

    ```shell-session
    $ tmux -S farming
    ```

    * Move process to background by detaching

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * To re-attach

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * To delete farming session

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 3d4fb21ec1f..09405f0408e 100644 --- a/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/uk/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    Occasionally after updating to a new version of the Pulsar you will need to wipe your node and farmer, generally this should not be required but can be attempted if your farmer is having issues after having had worked fine previously.

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. To see the backtrace, you need to enable the RUST_BACKTRACE environment variable.

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/index.html b/uk/docs/pre-release/farming-&-staking/index.html index 357e13e5b4c..7b2fd182c2a 100644 --- a/uk/docs/pre-release/farming-&-staking/index.html +++ b/uk/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/staking/index.html b/uk/docs/pre-release/farming-&-staking/staking/index.html index de6902a8433..9647493da1c 100644 --- a/uk/docs/pre-release/farming-&-staking/staking/index.html +++ b/uk/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/staking/intro/index.html b/uk/docs/pre-release/farming-&-staking/staking/intro/index.html index 62d08c53729..92f81260ea3 100644 --- a/uk/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/uk/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/staking/operators/index.html b/uk/docs/pre-release/farming-&-staking/staking/operators/index.html index 9fc1f2c4159..ca4856e949e 100644 --- a/uk/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/uk/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/timekeeping/index.html b/uk/docs/pre-release/farming-&-staking/timekeeping/index.html index bf22ac8f08b..c8dfa103124 100644 --- a/uk/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/uk/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/uk/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 4c57b759afc..360aaccef55 100644 --- a/uk/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/uk/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    danger

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. then click “Add the account with the generated seed”

      step-6

    3. Congratulations you have created a polkadot.js wallet!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/uk/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index ad3a721fe57..9ce8939ec59 100644 --- a/uk/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/uk/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/learn/intro/index.html b/uk/docs/pre-release/learn/intro/index.html index f28dcf778c6..6bafca5f8aa 100644 --- a/uk/docs/pre-release/learn/intro/index.html +++ b/uk/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/learn/security/index.html b/uk/docs/pre-release/learn/security/index.html index 68103fe518b..6efb089aa84 100644 --- a/uk/docs/pre-release/learn/security/index.html +++ b/uk/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/learn/subnomicon/index.html b/uk/docs/pre-release/learn/subnomicon/index.html index cad416970b1..a3567c91cf0 100644 --- a/uk/docs/pre-release/learn/subnomicon/index.html +++ b/uk/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/uk/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index c6dd985c874..474d7ab4127 100644 --- a/uk/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/uk/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -62,7 +62,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/participate/contribute/index.html b/uk/docs/pre-release/participate/contribute/index.html index 8b7f3e1beeb..2ee25cc245e 100644 --- a/uk/docs/pre-release/participate/contribute/index.html +++ b/uk/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • Try and think about your code from a 3rd person view, it should make sense to anyone with a similar background in the technology that you are using.
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    Community

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/uk/docs/pre-release/participate/index.html b/uk/docs/pre-release/participate/index.html index ec8ffb6d761..cba2653e04a 100644 --- a/uk/docs/pre-release/participate/index.html +++ b/uk/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Awesome Subspace

    caution

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    Bringing the PoC Consensus to Substrate

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/uk/docs/pre-release/participate/translate/index.html b/uk/docs/pre-release/participate/translate/index.html index 729b9868480..b2f85903c33 100644 --- a/uk/docs/pre-release/participate/translate/index.html +++ b/uk/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    Version: Pre-Release

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. Spot to input language translation of english text
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/uk/index.html b/uk/index.html index a428fc7e23d..617b37b357e 100644 --- a/uk/index.html +++ b/uk/index.html @@ -7,13 +7,13 @@ - +

    Ферма звідусіль

    Заробляйте винагороди, запускаючи вузол фермера, даючи обіцянку вільного диска. Не потрібно дорогого налаштування або авансового капіталу.

    'Lightweight'

    'Run the farmer node in the background on your computer without affecting your daily usage, with minimal maintenance.'

    'Easy to setup'

    'To set up the application takes only a few minutes. It supports Linux, Windows and macOS operating systems.'

    'Frequent rewards'

    'Get rewarded by contributing to a globally distributed network that gives control back to users and creators.'

    - + \ No newline at end of file diff --git a/uk/markdown-page/index.html b/uk/markdown-page/index.html index 85907af2ca3..eb932dfdd32 100644 --- a/uk/markdown-page/index.html +++ b/uk/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/404.html b/zh/404.html index d61a1314706..d6db5b0322d 100644 --- a/zh/404.html +++ b/zh/404.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/assets/js/41e73915.9fa4eced.js b/zh/assets/js/41e73915.9fa4eced.js new file mode 100644 index 00000000000..6566bb53d86 --- /dev/null +++ b/zh/assets/js/41e73915.9fa4eced.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[6529],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7681:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/zh/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/zh/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/zh/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/zh/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/zh/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/zh/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZEAAABOCAYAAADhPisZAAAK0mlDQ1BJQ0MgUHJvZmlsZQAASImVlwdUU9kWhs+96SGhJICAlNB7bwGkhB5AeheVkAQSSowJQcSuDI7gWFARAWVAB0EUHB2K2BBRLAwCFuwTZBBRn4MFGyrvAo8wM2+999bba52cb+3ss8/eZ91z138BIPuyhMJMWBGALEG2KDLAmxafkEjDjQACoABloA+sWWyxkBEeHgIQm53/au/vAGhqvmk5levf//+vRuFwxWwAoCSEUzhidhbC7ch4yhaKsgFA1SJ+/RXZwinuRlhZhBSIsHSK02b43RSnTDMaPx0THemDsCYAeBKLJUoDgGSC+Gk57DQkDykQYRsBhy9AOBdhDzaPxUG4FWGLrKxlU/w7wiZIvBAAMglhesqfcqb9JX+KLD+LlSbjmb6mDe/LFwszWSv/z6P535aVKZndwwgZJJ4oMBKZ5ZHzu5uxLFjGgpTQsFnmc6bjp5knCYyZZbbYJ3GWOSzfYNnazNCQWU7l+zNlebKZ0bPMFftFzbJoWaRsr1SRD2OWWaK5fSUZMTI/j8uU5c/jRcfNcg4/NnSWxRlRwXMxPjK/SBIpq58rCPCe29df1nuW+E/98pmytdm86EBZ76y5+rkCxlxOcbysNg7X128uJkYWL8z2lu0lzAyXxXMzA2R+cU6UbG028nDOrQ2XnWE6Kyh8lkEgCAc0YAccABcg9Wdzc7OnmvBZJlwp4qfxsmkM5KZxaUwB28qCZmdjZw/A1L2deRTe3pi+j5BaypyPi2Sx70ScjDkf/wUAp6uQK6g45zNGHlLFcgDOP2RLRDkzPvTUDwYQgQLyRlAH2shbwQRYItU5ATfgBfxAEAgD0SABLAFswANZQARWgNVgAygARWAH2APKQCU4CGrBMXACtIAz4AK4DK6DXnAbPABSMAxegDHwHkxAEISDyBAVUod0IEPIHLKD6JAH5AeFQJFQApQMpUECSAKthjZBRVAxVAZVQXXQz9Ap6AJ0FeqD7kGD0Cj0BvoMo2ASrAxrwUawNUyHGXAwHA0vhtPg5XAenA9vg0vhavgo3AxfgK/Dt2Ep/AIeRwGUHEoVpYuyRNFRPqgwVCIqFSVCrUUVokpQ1agGVBuqC3UTJUW9RH1CY9FUNA1tiXZDB6Jj0Gz0cvRa9FZ0GboW3YzuRN9ED6LH0N8wZIwmxhzjimFi4jFpmBWYAkwJpgbThLmEuY0ZxrzHYrGqWGOsMzYQm4BNx67CbsXuxzZi27F92CHsOA6HU8eZ49xxYTgWLhtXgNuHO4o7j+vHDeM+4uXwOng7vD8+ES/Ab8SX4I/gz+H78SP4CYIiwZDgSggjcAgrCdsJhwhthBuEYcIEUYloTHQnRhPTiRuIpcQG4iXiQ+JbOTk5PTkXuQg5vtx6uVK543JX5AblPpEoJDOSDymJJCFtIx0mtZPukd6SyWQjshc5kZxN3kauI18kPyZ/lKfKW8kz5Tny6+TL5Zvl++VfKRAUDBUYCksU8hRKFE4q3FB4qUhQNFL0UWQprlUsVzylOKA4rkRVslUKU8pS2qp0ROmq0jMKjmJE8aNwKPmUg5SLlCEqiqpP9aGyqZuoh6iXqMPKWGVjZaZyunKR8jHlHuUxFYqKg0qsSq5KucpZFakqStVIlamaqbpd9YTqHdXP87TmMeZx522Z1zCvf94HtflqXmpctUK1RrXbap/Vaep+6hnqO9Vb1B9poDXMNCI0Vmgc0Lik8XK+8ny3+ez5hfNPzL+vCWuaaUZqrtI8qNmtOa6lrRWgJdTap3VR66W2qraXdrr2bu1z2qM6VB0PHb7Obp3zOs9pKjQGLZNWSuukjelq6gbqSnSrdHt0J/SM9WL0Nuo16j3SJ+rT9VP1d+t36I8Z6BgsNFhtUG9w35BgSDfkGe417DL8YGRsFGe02ajF6JmxmjHTOM+43vihCdnE02S5SbXJLVOsKd00w3S/aa8ZbOZoxjMrN7thDps7mfPN95v3WWAsXCwEFtUWA5YkS4ZljmW95aCVqlWI1UarFqtX1gbWidY7rbusv9k42mTaHLJ5YEuxDbLdaNtm+8bOzI5tV253y55s72+/zr7V/rWDuQPX4YDDXUeq40LHzY4djl+dnJ1ETg1Oo84GzsnOFc4DdGV6OH0r/YoLxsXbZZ3LGZdPrk6u2a4nXP9ws3TLcDvi9myB8QLugkMLhtz13FnuVe5SD5pHssePHlJPXU+WZ7XnEy99L45XjdcIw5SRzjjKeOVt4y3ybvL+4OPqs8an3RflG+Bb6NvjR/GL8Svze+yv55/mX+8/FuAYsCqgPRATGBy4M3CAqcVkM+uYY0HOQWuCOoNJwVHBZcFPQsxCRCFtC+GFQQt3LXwYahgqCG0JA2HMsF1hj8KNw5eHn47ARoRHlEc8jbSNXB3ZFUWNWhp1JOp9tHf09ugHMSYxkpiOWIXYpNi62A9xvnHFcdJ46/g18dcTNBL4Ca2JuMTYxJrE8UV+i/YsGk5yTCpIurPYeHHu4qtLNJZkLjm7VGEpa+nJZExyXPKR5C+sMFY1azyFmVKRMsb2Ye9lv+B4cXZzRrnu3GLuSKp7anHqszT3tF1pozxPXgnvJd+HX8Z/nR6YXpn+ISMs43DGZGZcZmMWPis565SAIsgQdC7TXpa7rE9oLiwQSpe7Lt+zfEwULKoRQ+LF4tZsZUQgdUtMJN9JBnM8cspzPq6IXXEyVylXkNu90mzllpUjef55P61Cr2Kv6litu3rD6sE1jDVVa6G1KWs71umvy183vD5gfe0G4oaMDb9utNlYvPHdprhNbfla+evzh74L+K6+QL5AVDCw2W1z5ffo7/nf92yx37Jvy7dCTuG1IpuikqIvW9lbr/1g+0PpD5PbUrf1bHfafmAHdodgx52dnjtri5WK84qHdi3c1bybtrtw97s9S/dcLXEoqdxL3CvZKy0NKW3dZ7Bvx74vZbyy2+Xe5Y0VmhVbKj7s5+zvP+B1oKFSq7Ko8vOP/B/vVgVUNVcbVZccxB7MOfj0UOyhrp/oP9XVaNQU1Xw9LDgsrY2s7axzrqs7onlkez1cL6kfPZp0tPeY77HWBsuGqkbVxqLj4Ljk+POfk3++cyL4RMdJ+smGXwx/qWiiNhU2Q80rm8daeC3S1oTWvlNBpzra3NqaTludPnxG90z5WZWz288Rz+Wfmzyfd368Xdj+8kLahaGOpR0PLsZfvNUZ0dlzKfjSlcv+ly92MbrOX3G/cuaq69VT1+jXWq47XW/uduxu+tXx16Yep57mG843Wntdetv6FvSd6/fsv3DT9+blW8xb12+H3u67E3Pn7kDSgPQu5+6ze5n3Xt/PuT/xYP1DzMPCR4qPSh5rPq7+zfS3RqmT9Oyg72D3k6gnD4bYQy9+F//+ZTj/KflpyYjOSN0zu2dnRv1He58vej78Qvhi4mXBP5T+UfHK5NUvf3j90T0WPzb8WvR68s3Wt+pvD79zeNcxHj7++H3W+4kPhR/VP9Z+on/q+hz3eWRixRfcl9Kvpl/bvgV/eziZNTkpZIlY01IAhQw4NRWAN4cRXZwAALUXAOKiGV09bdDMt8A0gf/EM9p72pwAqGkHIBbBKVlUMaVBkKGwHoApOYTII9jeXjb+ZeJUe7uZXCQNRJq0T06+mQQAlwzA157JyYnSycmvJTPfBedDZ/T8lOmNIRpoSudAA6NbwN9tRuv/qce/z0BWwV/mfwJHChVbDtPk/gAAAGJlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA5KGAAcAAAASAAAAUKACAAQAAAABAAABkaADAAQAAAABAAAATgAAAABBU0NJSQAAAFNjcmVlbnNob3Tg3lotAAACPGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+Nzg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NDAxPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Ct+LN4UAABcMSURBVHgB7Z0JmBRFlscf0NDcIDR3NyDQXM0h54LIjRxyiKLsKCAqOg4znrMz4+zst7uzuuuuOqijszMCyiGHct80pxwKtFxCt9wsct+nzdU0yMY/iiiStKsqO6uqO2v4v/66KiszMiLyly/ixXsRWVXgUuaFm0IhARIgARIgARcECro4h6eQAAmQAAmQgCZAI0JFIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE0gzvWZPJEE7lICxVs0ukuvnJf990bg8qbvwr4keiJhI2QGJEACJHD3EqAncvfee155mAQiMYoLswo8nQRcEYikN01PxNUt4EkkQAIkQAIgQCNCPSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkENO/J7J9/RHJSDsk+7adlBOHLsjFC1n6jpYsEy+VkspIrZSK0rhNkjRsXY13mgQ8RYC666nbwcqEQaDApcwLN8M4P19OXTFzuyybuk2OHzjvqPzKNcpKt4Ep0vnRho7SMxEJBCNgftDHzY9SUXeDkeWxvCIQjg7b6xhTRuTAztMy+b21sjfjhP06HH2u07iSPPnr+6VG/QRH6ZmIBHIi4KYBUndzIsl9+UXAjQ4HqmvMzImsX7ZP3hw227UBAQAYH+SBvCgkkFcEqLt5RZrl5AeBmJgTQSMc+a/LI8Ln5o83/Xm17lYrInkyExIIRIC6G4gM9/+9EPC8J4IwwKh//zLivJEn8qaQQLQIUHejRZb5eomA540I5kDgPURakCfyppBAtAhQd6NFlvl6iYCnjQhWsridRE9uUlnwH0yQN8qgkECkCVB3I02U+XmVgKfnRLCM16289HYv/6mpk7bI3vRjsif9uH+f2UAZXPpraPA9UgSou5EiyXy8TsCznggexnL6HAgg270OGA7z32vQfdJrULMc7wXKQFlO5NKlS3LgwAG5fPmyk+T+NFeuXJEVK1fKxYsX/fvC3di0+VvZsnWr42xu3rwpN278mGP6GzduCI6HKwcPHZKlyyKzAMJtXdZv2CD71T3KT/Gi7l67dk1wf86dO5drNGvXrpPDh521ESeZ51ZPoLfQ0Zz/c9ZpJ/XwSprc8vBKvU09POuJ4El0p9JrcDNlJO7zGY2J3+rTUm+940Ny48pSJ0hoC2UFe6r9h8xMGTtuvJw8edJfpSpVqsjTTw2RkiVL+vcF2oDxWLb8S6mbXNdR+kD5WPcvV/kVLFRQ7mvaVO9e/dXXUq9uXalUqaI1mX97+oxZsn//9/Lb3/yTf5/Z+Lc//of0fughub9tG7PL1fvGjZtk0+bN8kC7+6VYsWKu8gj3JHBuft99UrNGjXCzcn2+l3QXHe+MmbNka3q6/3qKxheVoUOHSPWkJP++YBuLly6Vzp06SWJiZL75wa4nBw4elBMnTkjrVq1yrMYf33hDfvwxZ2NRtkyZHHU6x4w8sjM9PUPii8br9ooq2Xl4pJqOq+FZI4KvMnEqMBIQGBKI1YDoHSFeQpUFA5J1NUuefXqo6qQrydGjx2T6zJkyRu1/+cVfhcg9OodfevGX/ozhRSxeskSKKsUMZET8iaO48XC/vtK1a5d8MyBRvLRcZR1Kn6yZRVt3Fy9ZKhnffScDHn1U6tSuJZmZF2VhaqqM/uRT+cPvX8+Xe2XXk+3bdwg8yEBG5Llnn5Ebt4zI9OkzpVSpktKjR3eNMb5IvBVnTGyvXL1aypcr5zcidh4xcRGWSnrWiOC7sAIJPA/T+JDG6mW4MSTBysIICB5Ixw4dpHbt2rpKdesmy/AXfi5Hjx3Tn/9v3z6ZPPkLef13v5EiRYrofWlp30jaN+vl1Vde0p/xcuToEZk6bbqcPXdWqlWtKr169pAat0bMkz+fohp0UR3y2r1nj5QuVUoGDxok6RkZsnbdOilYsKC0aN5c+vR+SOc3b/4CKVy4sLR/oJ387eNR/n1Lly6Xf/nD7/VnNy+oR/HixQQhuJ27dklcoTjp1KmjLgf5wWClLlos3367Ra5mXZUqlSvL4489JhUqJGgvZM2adfLaqy/roo8dOy4LFi4UjDRLlSylr3f2nLky9KnBUr16dQlVFjJZB47q//yF89q7gMdUsWIFnT9CNDNnzZZdu3frz926dNHv+f0STJ/yUnfBYZ/STQx8mjfzDbBKly6t+A+RPXv36tH99evX5e13/iQDHx8gycnJGt3x48eVkRkjGKiULVtW70MId8zYcfL9/v1yj9rX/oEHpFWrlvrY2nVpsnHTJmmU0lC++nqN3tevbx+tn3PmzNN6UkPd7yGDB0l8fPwdegIvCWFZtLM3//OtO3RNZ6ReTBvB56KqjeAaat17rzms9QgDqAs//KCvd9ATT0i9enUF3vr6jRu1Lpe7p5w80v9hqVnT56G+9T9vS/t27WSral/wgqCfAwY8IrVr1dL5gsH0GTPlhGr78NzatGktXW/pF9rGrNlzFcM9ut5oy0/87B+VcSulzz1/4YLMmzdf9n3/vW4/dVWE4JH+/SQuLk7ee/8DOXP2rC4T1wuPEGVZ2w3Cd/Pmz5edO3dJ1rUsrfd9+/SWcsrwQELVXSfKwxfPzomYL1PMiQUMBQyH+benwXH7HIk9jfVzsLLQeVesWFE1jq9ljYoNY14Ecs8990hKw4Z6+1rWNd1QrC73latXlFLfaQjnzJ2nDFEt6d2rlxoRZmpPBqEyyAXVSaIhQtH69e0rV5Xn89ePP5atW9OV4eitRy3r0tJ04/elvyA/qEYDxe3Tx2dYGjdu7DcyOlMXL6jHBtXwrmZlyUM9e6rrLCuLFi+WLPUZAsO4Zu1a6dSxgzIeAzSPcePH62OXL1/RnT0+oNP55NMxcvLUKWU8ekrTpk1k6vTpmlN2drZOH6osdC7zFyxQnUh1ncfp06f1CPrq1av6/M+/mKJH2fe3bStdOneWL1es9N8fnSCfXoLpU17qLi6/luoUj6nBDnTv1Cnfc1EY6EB3S5QooTvBy1cuq87qmp9WdvZ1fZ+uX7/h34d7jgFEvz59pIwKIc2eqzpRNdiB4F6jI874bpsOi1ZISNAd8LTpM7SedFaDEBgf3B9f+tt60rJFc7m3Zk09SOrbt7cK+foMmU7o8AV6hDBqltKLXj16aKO5adNmWbFqlTRRbQIdMOTTsWP984Jox4uU9w5j1L1bN4FOzp0731/iyNGfiBQoIDBIzZs303X/Tl0fBAOhHTt3aKMCw3JMGYFJkz/XxzCwGa3O3b//gGBQ00JdX3pGukyZOk0f7979Qc0dfQquFx6Jtd0g0TTVTtAGce6DXbuqwedRGTX6U38bDFV3XVAevnjWEwmXQZ0mVXJcjeUmX4zcxowZq8MACAWUKV1GWrduqWL/7XSn7zTPli1aKAPRRydv0KC+vPOnEZKh4qPt1BwCBPFdjGggaLBzVEMdPOhJqVq1iqCxISxx5MhRSa5TR6fBC0Z2mBfBqKmm6mzRWYcr6Fww31NANSKM6N4d8Z5qNDt1OYcOH741MvsHKVSokG6EMBR22blrt+6IXvvFK5KQUF4fRr6pixbdkTRYWZjfaNiggTz6SH99TsOGDdSo+V3ZvXuP1KlTW+CxwUBhDgZSo3qS6MavP8XuSyR1t4fqtM6cOaPDRQgZwYA0b9ZMOnRor/S4tGNIGDQ9+8zTWifQuY147335Wg2qjPeCjJ4f9qzyYosrnagpI9SIG4bd6Dbu2WGlO3aBl4H5ReiVmd+zp3HyGZ7ECz9/XtcP6eFxDH/hBf88DryxUapzh0FNTPTN7cDAPNSrp84ec3iz5swRDOoKKr2HMWipPP/69evp/xTlZaEMCNr9g8rwGL3Ozr4mK1et1sfg4cETefGXw/V1YScMxrZtPgPUKCVFGyQYj5yuF4M1tHMM4Ay75OQ68sGHH2m9b9y4kS4nUN0Rwchr8awRwde5Z57zjTjtULDqKlA4C2n1qizLxLr9fPtnlBVM0Ln/+rVXtQKiM12/fqNehbRLdZRQXKcCw2EEozk0TIwyjFRVbrGREiWK602jqOjQ4VYj/BBtSaxWzd8YEc6Ad3T2rG9VTxOlxFuVh/DWf78taFhQaqtRM3U7cuSIrq+pP/bXr1fvJ0YkUFnw6rCSCP9mlGfyPqzyLlGyhP5YXxk5IwiRwXPMb/GS7sLQI4yEUM+2bdv1vUv75hvZsmWr0ulXdMjJCS/cO+ggBIwRotm2/fYzVjBOMCAQDAwgFSv4wo7YhscMzzlaAsNg6ocyEpQ3hA59/oKFqtxMFXr2tTN0+EagL0bM9vnz5/WCA3T885QXjAUJDdRABuHAkiV9i2jQTuElr/7qK+2FoU8wcvjQYd1eYBiN4FwTTjT7Ar2b/gCDNyMVFEe0fRhaY0RMfZHGbKPuNCKGmnrH74EENCLKQKRa0r6sngkx8yK5NSDIBmU5ESgG/jHCmqYm+LZs3aIbpzkX3oMRy6bZ9ZMGizmN7GxfaMefKEobhQvH6RCZPXsTpoKhMIKOxyrWjhmdCUZZ36zfINt37NBhBKyEev65YdZT1CS/Mng37jR4pixrwkBlGWOJxmNizTgPMeukpEQ/N2u9cdxaV3zOD/Gi7sLrwOo7/KMDRKgJ3mLjRik+RLdVV26qP7vYOdt1t2CB/DXeVgOCusOLxbL6CgkVVCebJBis2Jc3x1n03K43mPMEp3QVKcCiFfw/P2yY9nBGjR4tGMhA72FsYDRNmDtbDfIwj+hWsq/5+gM770Jxhfw6j7yD1d1t2W7Py987H6TW+EGp3IobA4IygpV1/PgJeefdET9ZJ5+c7Jtk/1FNghWJL6Krag3rnFYhBLvsV3FhI3CXEeO3eh/mmNt3awzbngdGK5gIP3Pm7B2HMFqDOF3uiUnF8uXLS/+H++nVPZ07dtTPZcCFtwo6ehgC69LSlSpG7VQwskXjRHgOIUDz/5iah8FSZjPSw6S9kXPnzueJp2bKC/QeTJ8CnRMN3cWg5v0PPhQ852GVOrcWiNxU3p7prE6cvP3zCmfVxK9drLqLY/iMRRWREut8YiTyROgOAx4sbEE4tPWtRQBO8sbENgZ3WC32nArRYRUb9BEeXKYKd8GA9FXzlBg4Pdyvr7RQ4UEj0Hu0M3h+RhCCxhJ8q5hBknUftqtV80UjDh485D+EOScYKRhCL4p7kxnlq8EvEi75PMNRKR++nqon0q1PpMM7MQIvBY00kKCsQIIlsxhBT5w0Wa/uwMgDDW7BglTdyWHiuUiRwvr0pUuXSU81sXfm7BkdNoDiWQUTi1hhkVA+QYXDlulJzRQV5w9XMAorXqy4ClFs0cbAxHyt+dZVcVV0GB+PHKUbFVxkPOQ0a/ZsPcdTuXIla/KA25jMhlv99NCndDjulDKEGMWVuuXqmxPRgDFpidVoq1Yrt//SZf2wmDnu5B2xeyxoAHPkBc8H3DBvhNgyRpmY5MQyz3hlyOdYJkad5B+tNF7RXegFwompamFEnPJ6scQXk7hYrABJVqsMce8wx7dhwyZJSkzSneXC1DvnrZAW93zR4iXKc2nkm5tTYdj+/frhUNiCsBc61c1qxV89VScTDgsnY4R1UGc8JAmPeOq0GY6zO3XqpHz0v3+Vtm3aSPv2D8gZpeOoH1YFmuefdqiVi7Vq3atWVp1Qc0Nr/XnDQKPdjxv/mTYweDQAbQDndlB5QXC9WFGIVZ1JiYn+c7GBkBkGSJifgbeHlZK4H2i7uF9eFM8aETz8h18kdPrUutWAYGWWCW8B+l71dSeBnh1BGcEeNERD/IVybSdMnCifqX8jmBh7Rj03AoHS9+zeXZaoDu5vI0fq+GWD+vW1kpj0eO+kRu3o9KCQCNMMfPwx3UHimN0dx76cRFVHiz19586d9HwDyv+vN9/4yalQzl8NHy7jP/tMJk6e7D+O5YlYOGDEnu/t/b4teCATlEHFJCUE1zH4ySf1JLupmy+lyFNDBuu4+b59399azdZA/vzRX8zhgNds8umpngXAKAzLhDFSRYfXtUtnbUCQybPPDJVxn01Q9Zmk82zVsqVgpZHK2F9Gfmx4RXdx7dCxL6ZM1Ys0DAt0chgEmIl1pBmrVtiNnzBBJ8ECEKwUtOoClpcjtAOjjvuADtYs8XWK2+RnT4+5tVXq2YkZ6tmrDmrpsHkGxNQ31LvJ15qun/IQxo+foNsj9mM571dr1gTUDZNHASkglZWH9WC3rrL8yxVqiXmazhYLPMxCGqxQm690EroMlpgg3/yt7yFn9AUIe30xZYpeSYiTYRR+dmvBDD63VSHFPXv26iXTw57BYgXsvS3YN2HiJH87xdwp9gWa77DW/XYuebfl6V82xJfYTXxX3fgoyuDftnP83VkI5WCCuXz5cjrmb68WwgdwO80EnP04PiMNOsZIjLbs+SNvPKFsQhT24+YzPCuELOCNhEprzrG/IxyHsszIzH4c8Wd4XuhoTKhsxcpVKla9XP759d8FZWTPC5/x1D+YmQZjTYPrwX6752dNE8ltJ78K5zXdxcDl1KnTimFx/ZxFTjzAuJjyaAsVKpjTYb0P+o0J9JzuQ8CTHB5ACAn6GMm8UV/Mz9nn3hxWSesdrheG0ypO2jr0EufBo8hJcL2BjiE92hfuG1ZgRlqc6LDTMj3rieAC8MWIaYv2uv4m31AQ8HO5ufnyRXSY1aoF/joPKH8wA4L6IE00DIjJ24lRgFKaOYVQjAIdD9VhY1UXvmcMk5NV1UgsM/Oifm6mqRq1hWKUU5nBzolGI8upDrnZ5zXdhV5UqRJ8DiMYY3Pt0dJd5B+sQzXl5/Y93PoGYuKkrYfSy1DXC8Pn1vjlllM46e80r+HkFKVz8ZvoBQra/L0IlIU8kTclOgTQyF55+WV5WD04majivk2bNNZLTQeqifG7Rai7d8udvruv09PhLHNrIvkToybPF97sKvx5XEOD77khkJtQAHU3N2SZNq8I5EaHQ9XJ854ILgCdPTr9SHgkyIMGJJRa8HikCFB3I0WS+XiVgKfnRKzQ0BgrJZbWP2nr9tcOMQeCEEON+gnWrLlNAlElQN2NKl5mns8EYiKcZWeElS/45Tiny3+xjLfbwJRcTaLby+RnEjAEwgkFUHcNRb7nJ4FwdNhe75g0IuYi8Aty+AEg/H4Dvn7bfHsqvrsIXz2BJ4fx4Few50BMXnwnAacEItEAqbtOaTNdNAhEQodNvWLaiJiL4DsJ5CWBSDbAvKw3yyIBQyCSOhwTE+vmwvlOAiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRYBGJKZuFytLAiRAAt4iQCPirfvB2pAACZBATBGgEYmp28XKkgAJkIC3CNCIeOt+sDYkQAIkEFMEaERi6naxsiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRSBmfk8kpqiysncFAfMldnfFxfIiSSAAAXoiAcBwNwmQAAmQQGgC/Cr40IyYggRIgARIIAABeiIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgCNCKhGTEFCZAACZBAAAI0IgHAcDcJkAAJkEBoAjQioRkxBQmQAAmQQAACNCIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgC/w/zX0lg9vhbHgAAAABJRU5ErkJggg=="},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/zh/assets/js/41e73915.b8d1fd9f.js b/zh/assets/js/41e73915.b8d1fd9f.js deleted file mode 100644 index 4f1b3b6ade4..00000000000 --- a/zh/assets/js/41e73915.b8d1fd9f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[6529],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},7681:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/zh/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/zh/docs/pre-release/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/zh/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/zh/docs/pre-release/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/zh/docs/pre-release/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/zh/docs/pre-release/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/zh/assets/js/eec8f163.1384e9c8.js b/zh/assets/js/eec8f163.1384e9c8.js deleted file mode 100644 index 7a623197c84..00000000000 --- a/zh/assets/js/eec8f163.1384e9c8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[9122],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1003:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/zh/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/zh/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/zh/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/zh/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/zh/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/zh/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZEAAABOCAYAAADhPisZAAAK0mlDQ1BJQ0MgUHJvZmlsZQAASImVlwdUU9kWhs+96SGhJICAlNB7bwGkhB5AeheVkAQSSowJQcSuDI7gWFARAWVAB0EUHB2K2BBRLAwCFuwTZBBRn4MFGyrvAo8wM2+999bba52cb+3ss8/eZ91z138BIPuyhMJMWBGALEG2KDLAmxafkEjDjQACoABloA+sWWyxkBEeHgIQm53/au/vAGhqvmk5levf//+vRuFwxWwAoCSEUzhidhbC7ch4yhaKsgFA1SJ+/RXZwinuRlhZhBSIsHSK02b43RSnTDMaPx0THemDsCYAeBKLJUoDgGSC+Gk57DQkDykQYRsBhy9AOBdhDzaPxUG4FWGLrKxlU/w7wiZIvBAAMglhesqfcqb9JX+KLD+LlSbjmb6mDe/LFwszWSv/z6P535aVKZndwwgZJJ4oMBKZ5ZHzu5uxLFjGgpTQsFnmc6bjp5knCYyZZbbYJ3GWOSzfYNnazNCQWU7l+zNlebKZ0bPMFftFzbJoWaRsr1SRD2OWWaK5fSUZMTI/j8uU5c/jRcfNcg4/NnSWxRlRwXMxPjK/SBIpq58rCPCe29df1nuW+E/98pmytdm86EBZ76y5+rkCxlxOcbysNg7X128uJkYWL8z2lu0lzAyXxXMzA2R+cU6UbG028nDOrQ2XnWE6Kyh8lkEgCAc0YAccABcg9Wdzc7OnmvBZJlwp4qfxsmkM5KZxaUwB28qCZmdjZw/A1L2deRTe3pi+j5BaypyPi2Sx70ScjDkf/wUAp6uQK6g45zNGHlLFcgDOP2RLRDkzPvTUDwYQgQLyRlAH2shbwQRYItU5ATfgBfxAEAgD0SABLAFswANZQARWgNVgAygARWAH2APKQCU4CGrBMXACtIAz4AK4DK6DXnAbPABSMAxegDHwHkxAEISDyBAVUod0IEPIHLKD6JAH5AeFQJFQApQMpUECSAKthjZBRVAxVAZVQXXQz9Ap6AJ0FeqD7kGD0Cj0BvoMo2ASrAxrwUawNUyHGXAwHA0vhtPg5XAenA9vg0vhavgo3AxfgK/Dt2Ep/AIeRwGUHEoVpYuyRNFRPqgwVCIqFSVCrUUVokpQ1agGVBuqC3UTJUW9RH1CY9FUNA1tiXZDB6Jj0Gz0cvRa9FZ0GboW3YzuRN9ED6LH0N8wZIwmxhzjimFi4jFpmBWYAkwJpgbThLmEuY0ZxrzHYrGqWGOsMzYQm4BNx67CbsXuxzZi27F92CHsOA6HU8eZ49xxYTgWLhtXgNuHO4o7j+vHDeM+4uXwOng7vD8+ES/Ab8SX4I/gz+H78SP4CYIiwZDgSggjcAgrCdsJhwhthBuEYcIEUYloTHQnRhPTiRuIpcQG4iXiQ+JbOTk5PTkXuQg5vtx6uVK543JX5AblPpEoJDOSDymJJCFtIx0mtZPukd6SyWQjshc5kZxN3kauI18kPyZ/lKfKW8kz5Tny6+TL5Zvl++VfKRAUDBUYCksU8hRKFE4q3FB4qUhQNFL0UWQprlUsVzylOKA4rkRVslUKU8pS2qp0ROmq0jMKjmJE8aNwKPmUg5SLlCEqiqpP9aGyqZuoh6iXqMPKWGVjZaZyunKR8jHlHuUxFYqKg0qsSq5KucpZFakqStVIlamaqbpd9YTqHdXP87TmMeZx522Z1zCvf94HtflqXmpctUK1RrXbap/Vaep+6hnqO9Vb1B9poDXMNCI0Vmgc0Lik8XK+8ny3+ez5hfNPzL+vCWuaaUZqrtI8qNmtOa6lrRWgJdTap3VR66W2qraXdrr2bu1z2qM6VB0PHb7Obp3zOs9pKjQGLZNWSuukjelq6gbqSnSrdHt0J/SM9WL0Nuo16j3SJ+rT9VP1d+t36I8Z6BgsNFhtUG9w35BgSDfkGe417DL8YGRsFGe02ajF6JmxmjHTOM+43vihCdnE02S5SbXJLVOsKd00w3S/aa8ZbOZoxjMrN7thDps7mfPN95v3WWAsXCwEFtUWA5YkS4ZljmW95aCVqlWI1UarFqtX1gbWidY7rbusv9k42mTaHLJ5YEuxDbLdaNtm+8bOzI5tV253y55s72+/zr7V/rWDuQPX4YDDXUeq40LHzY4djl+dnJ1ETg1Oo84GzsnOFc4DdGV6OH0r/YoLxsXbZZ3LGZdPrk6u2a4nXP9ws3TLcDvi9myB8QLugkMLhtz13FnuVe5SD5pHssePHlJPXU+WZ7XnEy99L45XjdcIw5SRzjjKeOVt4y3ybvL+4OPqs8an3RflG+Bb6NvjR/GL8Svze+yv55/mX+8/FuAYsCqgPRATGBy4M3CAqcVkM+uYY0HOQWuCOoNJwVHBZcFPQsxCRCFtC+GFQQt3LXwYahgqCG0JA2HMsF1hj8KNw5eHn47ARoRHlEc8jbSNXB3ZFUWNWhp1JOp9tHf09ugHMSYxkpiOWIXYpNi62A9xvnHFcdJ46/g18dcTNBL4Ca2JuMTYxJrE8UV+i/YsGk5yTCpIurPYeHHu4qtLNJZkLjm7VGEpa+nJZExyXPKR5C+sMFY1azyFmVKRMsb2Ye9lv+B4cXZzRrnu3GLuSKp7anHqszT3tF1pozxPXgnvJd+HX8Z/nR6YXpn+ISMs43DGZGZcZmMWPis565SAIsgQdC7TXpa7rE9oLiwQSpe7Lt+zfEwULKoRQ+LF4tZsZUQgdUtMJN9JBnM8cspzPq6IXXEyVylXkNu90mzllpUjef55P61Cr2Kv6litu3rD6sE1jDVVa6G1KWs71umvy183vD5gfe0G4oaMDb9utNlYvPHdprhNbfla+evzh74L+K6+QL5AVDCw2W1z5ffo7/nf92yx37Jvy7dCTuG1IpuikqIvW9lbr/1g+0PpD5PbUrf1bHfafmAHdodgx52dnjtri5WK84qHdi3c1bybtrtw97s9S/dcLXEoqdxL3CvZKy0NKW3dZ7Bvx74vZbyy2+Xe5Y0VmhVbKj7s5+zvP+B1oKFSq7Ko8vOP/B/vVgVUNVcbVZccxB7MOfj0UOyhrp/oP9XVaNQU1Xw9LDgsrY2s7axzrqs7onlkez1cL6kfPZp0tPeY77HWBsuGqkbVxqLj4Ljk+POfk3++cyL4RMdJ+smGXwx/qWiiNhU2Q80rm8daeC3S1oTWvlNBpzra3NqaTludPnxG90z5WZWz288Rz+Wfmzyfd368Xdj+8kLahaGOpR0PLsZfvNUZ0dlzKfjSlcv+ly92MbrOX3G/cuaq69VT1+jXWq47XW/uduxu+tXx16Yep57mG843Wntdetv6FvSd6/fsv3DT9+blW8xb12+H3u67E3Pn7kDSgPQu5+6ze5n3Xt/PuT/xYP1DzMPCR4qPSh5rPq7+zfS3RqmT9Oyg72D3k6gnD4bYQy9+F//+ZTj/KflpyYjOSN0zu2dnRv1He58vej78Qvhi4mXBP5T+UfHK5NUvf3j90T0WPzb8WvR68s3Wt+pvD79zeNcxHj7++H3W+4kPhR/VP9Z+on/q+hz3eWRixRfcl9Kvpl/bvgV/eziZNTkpZIlY01IAhQw4NRWAN4cRXZwAALUXAOKiGV09bdDMt8A0gf/EM9p72pwAqGkHIBbBKVlUMaVBkKGwHoApOYTII9jeXjb+ZeJUe7uZXCQNRJq0T06+mQQAlwzA157JyYnSycmvJTPfBedDZ/T8lOmNIRpoSudAA6NbwN9tRuv/qce/z0BWwV/mfwJHChVbDtPk/gAAAGJlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA5KGAAcAAAASAAAAUKACAAQAAAABAAABkaADAAQAAAABAAAATgAAAABBU0NJSQAAAFNjcmVlbnNob3Tg3lotAAACPGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+Nzg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NDAxPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Ct+LN4UAABcMSURBVHgB7Z0JmBRFlscf0NDcIDR3NyDQXM0h54LIjRxyiKLsKCAqOg4znrMz4+zst7uzuuuuOqijszMCyiGHct80pxwKtFxCt9wsct+nzdU0yMY/iiiStKsqO6uqO2v4v/66KiszMiLyly/ixXsRWVXgUuaFm0IhARIgARIgARcECro4h6eQAAmQAAmQgCZAI0JFIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE2ARsQ1Op5IAiRAAiRAI0IdIAESIAEScE0gzvWZPJEE7lICxVs0ukuvnJf990bg8qbvwr4keiJhI2QGJEACJHD3EqAncvfee155mAQiMYoLswo8nQRcEYikN01PxNUt4EkkQAIkQAIgQCNCPSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkQCNCHSABEiABEnBNgEbENTqeSAIkQAIkENO/J7J9/RHJSDsk+7adlBOHLsjFC1n6jpYsEy+VkspIrZSK0rhNkjRsXY13mgQ8RYC666nbwcqEQaDApcwLN8M4P19OXTFzuyybuk2OHzjvqPzKNcpKt4Ep0vnRho7SMxEJBCNgftDHzY9SUXeDkeWxvCIQjg7b6xhTRuTAztMy+b21sjfjhP06HH2u07iSPPnr+6VG/QRH6ZmIBHIi4KYBUndzIsl9+UXAjQ4HqmvMzImsX7ZP3hw227UBAQAYH+SBvCgkkFcEqLt5RZrl5AeBmJgTQSMc+a/LI8Ln5o83/Xm17lYrInkyExIIRIC6G4gM9/+9EPC8J4IwwKh//zLivJEn8qaQQLQIUHejRZb5eomA540I5kDgPURakCfyppBAtAhQd6NFlvl6iYCnjQhWsridRE9uUlnwH0yQN8qgkECkCVB3I02U+XmVgKfnRLCM16289HYv/6mpk7bI3vRjsif9uH+f2UAZXPpraPA9UgSou5EiyXy8TsCznggexnL6HAgg270OGA7z32vQfdJrULMc7wXKQFlO5NKlS3LgwAG5fPmyk+T+NFeuXJEVK1fKxYsX/fvC3di0+VvZsnWr42xu3rwpN278mGP6GzduCI6HKwcPHZKlyyKzAMJtXdZv2CD71T3KT/Gi7l67dk1wf86dO5drNGvXrpPDh521ESeZ51ZPoLfQ0Zz/c9ZpJ/XwSprc8vBKvU09POuJ4El0p9JrcDNlJO7zGY2J3+rTUm+940Ny48pSJ0hoC2UFe6r9h8xMGTtuvJw8edJfpSpVqsjTTw2RkiVL+vcF2oDxWLb8S6mbXNdR+kD5WPcvV/kVLFRQ7mvaVO9e/dXXUq9uXalUqaI1mX97+oxZsn//9/Lb3/yTf5/Z+Lc//of0fughub9tG7PL1fvGjZtk0+bN8kC7+6VYsWKu8gj3JHBuft99UrNGjXCzcn2+l3QXHe+MmbNka3q6/3qKxheVoUOHSPWkJP++YBuLly6Vzp06SWJiZL75wa4nBw4elBMnTkjrVq1yrMYf33hDfvwxZ2NRtkyZHHU6x4w8sjM9PUPii8br9ooq2Xl4pJqOq+FZI4KvMnEqMBIQGBKI1YDoHSFeQpUFA5J1NUuefXqo6qQrydGjx2T6zJkyRu1/+cVfhcg9OodfevGX/ozhRSxeskSKKsUMZET8iaO48XC/vtK1a5d8MyBRvLRcZR1Kn6yZRVt3Fy9ZKhnffScDHn1U6tSuJZmZF2VhaqqM/uRT+cPvX8+Xe2XXk+3bdwg8yEBG5Llnn5Ebt4zI9OkzpVSpktKjR3eNMb5IvBVnTGyvXL1aypcr5zcidh4xcRGWSnrWiOC7sAIJPA/T+JDG6mW4MSTBysIICB5Ixw4dpHbt2rpKdesmy/AXfi5Hjx3Tn/9v3z6ZPPkLef13v5EiRYrofWlp30jaN+vl1Vde0p/xcuToEZk6bbqcPXdWqlWtKr169pAat0bMkz+fohp0UR3y2r1nj5QuVUoGDxok6RkZsnbdOilYsKC0aN5c+vR+SOc3b/4CKVy4sLR/oJ387eNR/n1Lly6Xf/nD7/VnNy+oR/HixQQhuJ27dklcoTjp1KmjLgf5wWClLlos3367Ra5mXZUqlSvL4489JhUqJGgvZM2adfLaqy/roo8dOy4LFi4UjDRLlSylr3f2nLky9KnBUr16dQlVFjJZB47q//yF89q7gMdUsWIFnT9CNDNnzZZdu3frz926dNHv+f0STJ/yUnfBYZ/STQx8mjfzDbBKly6t+A+RPXv36tH99evX5e13/iQDHx8gycnJGt3x48eVkRkjGKiULVtW70MId8zYcfL9/v1yj9rX/oEHpFWrlvrY2nVpsnHTJmmU0lC++nqN3tevbx+tn3PmzNN6UkPd7yGDB0l8fPwdegIvCWFZtLM3//OtO3RNZ6ReTBvB56KqjeAaat17rzms9QgDqAs//KCvd9ATT0i9enUF3vr6jRu1Lpe7p5w80v9hqVnT56G+9T9vS/t27WSral/wgqCfAwY8IrVr1dL5gsH0GTPlhGr78NzatGktXW/pF9rGrNlzFcM9ut5oy0/87B+VcSulzz1/4YLMmzdf9n3/vW4/dVWE4JH+/SQuLk7ee/8DOXP2rC4T1wuPEGVZ2w3Cd/Pmz5edO3dJ1rUsrfd9+/SWcsrwQELVXSfKwxfPzomYL1PMiQUMBQyH+benwXH7HIk9jfVzsLLQeVesWFE1jq9ljYoNY14Ecs8990hKw4Z6+1rWNd1QrC73latXlFLfaQjnzJ2nDFEt6d2rlxoRZmpPBqEyyAXVSaIhQtH69e0rV5Xn89ePP5atW9OV4eitRy3r0tJ04/elvyA/qEYDxe3Tx2dYGjdu7DcyOlMXL6jHBtXwrmZlyUM9e6rrLCuLFi+WLPUZAsO4Zu1a6dSxgzIeAzSPcePH62OXL1/RnT0+oNP55NMxcvLUKWU8ekrTpk1k6vTpmlN2drZOH6osdC7zFyxQnUh1ncfp06f1CPrq1av6/M+/mKJH2fe3bStdOneWL1es9N8fnSCfXoLpU17qLi6/luoUj6nBDnTv1Cnfc1EY6EB3S5QooTvBy1cuq87qmp9WdvZ1fZ+uX7/h34d7jgFEvz59pIwKIc2eqzpRNdiB4F6jI874bpsOi1ZISNAd8LTpM7SedFaDEBgf3B9f+tt60rJFc7m3Zk09SOrbt7cK+foMmU7o8AV6hDBqltKLXj16aKO5adNmWbFqlTRRbQIdMOTTsWP984Jox4uU9w5j1L1bN4FOzp0731/iyNGfiBQoIDBIzZs303X/Tl0fBAOhHTt3aKMCw3JMGYFJkz/XxzCwGa3O3b//gGBQ00JdX3pGukyZOk0f7979Qc0dfQquFx6Jtd0g0TTVTtAGce6DXbuqwedRGTX6U38bDFV3XVAevnjWEwmXQZ0mVXJcjeUmX4zcxowZq8MACAWUKV1GWrduqWL/7XSn7zTPli1aKAPRRydv0KC+vPOnEZKh4qPt1BwCBPFdjGggaLBzVEMdPOhJqVq1iqCxISxx5MhRSa5TR6fBC0Z2mBfBqKmm6mzRWYcr6Fww31NANSKM6N4d8Z5qNDt1OYcOH741MvsHKVSokG6EMBR22blrt+6IXvvFK5KQUF4fRr6pixbdkTRYWZjfaNiggTz6SH99TsOGDdSo+V3ZvXuP1KlTW+CxwUBhDgZSo3qS6MavP8XuSyR1t4fqtM6cOaPDRQgZwYA0b9ZMOnRor/S4tGNIGDQ9+8zTWifQuY147335Wg2qjPeCjJ4f9qzyYosrnagpI9SIG4bd6Dbu2WGlO3aBl4H5ReiVmd+zp3HyGZ7ECz9/XtcP6eFxDH/hBf88DryxUapzh0FNTPTN7cDAPNSrp84ec3iz5swRDOoKKr2HMWipPP/69evp/xTlZaEMCNr9g8rwGL3Ozr4mK1et1sfg4cETefGXw/V1YScMxrZtPgPUKCVFGyQYj5yuF4M1tHMM4Ay75OQ68sGHH2m9b9y4kS4nUN0Rwchr8awRwde5Z57zjTjtULDqKlA4C2n1qizLxLr9fPtnlBVM0Ln/+rVXtQKiM12/fqNehbRLdZRQXKcCw2EEozk0TIwyjFRVbrGREiWK602jqOjQ4VYj/BBtSaxWzd8YEc6Ad3T2rG9VTxOlxFuVh/DWf78taFhQaqtRM3U7cuSIrq+pP/bXr1fvJ0YkUFnw6rCSCP9mlGfyPqzyLlGyhP5YXxk5IwiRwXPMb/GS7sLQI4yEUM+2bdv1vUv75hvZsmWr0ulXdMjJCS/cO+ggBIwRotm2/fYzVjBOMCAQDAwgFSv4wo7YhscMzzlaAsNg6ocyEpQ3hA59/oKFqtxMFXr2tTN0+EagL0bM9vnz5/WCA3T885QXjAUJDdRABuHAkiV9i2jQTuElr/7qK+2FoU8wcvjQYd1eYBiN4FwTTjT7Ar2b/gCDNyMVFEe0fRhaY0RMfZHGbKPuNCKGmnrH74EENCLKQKRa0r6sngkx8yK5NSDIBmU5ESgG/jHCmqYm+LZs3aIbpzkX3oMRy6bZ9ZMGizmN7GxfaMefKEobhQvH6RCZPXsTpoKhMIKOxyrWjhmdCUZZ36zfINt37NBhBKyEev65YdZT1CS/Mng37jR4pixrwkBlGWOJxmNizTgPMeukpEQ/N2u9cdxaV3zOD/Gi7sLrwOo7/KMDRKgJ3mLjRik+RLdVV26qP7vYOdt1t2CB/DXeVgOCusOLxbL6CgkVVCebJBis2Jc3x1n03K43mPMEp3QVKcCiFfw/P2yY9nBGjR4tGMhA72FsYDRNmDtbDfIwj+hWsq/5+gM770Jxhfw6j7yD1d1t2W7Py987H6TW+EGp3IobA4IygpV1/PgJeefdET9ZJ5+c7Jtk/1FNghWJL6Krag3rnFYhBLvsV3FhI3CXEeO3eh/mmNt3awzbngdGK5gIP3Pm7B2HMFqDOF3uiUnF8uXLS/+H++nVPZ07dtTPZcCFtwo6ehgC69LSlSpG7VQwskXjRHgOIUDz/5iah8FSZjPSw6S9kXPnzueJp2bKC/QeTJ8CnRMN3cWg5v0PPhQ852GVOrcWiNxU3p7prE6cvP3zCmfVxK9drLqLY/iMRRWREut8YiTyROgOAx4sbEE4tPWtRQBO8sbENgZ3WC32nArRYRUb9BEeXKYKd8GA9FXzlBg4Pdyvr7RQ4UEj0Hu0M3h+RhCCxhJ8q5hBknUftqtV80UjDh485D+EOScYKRhCL4p7kxnlq8EvEi75PMNRKR++nqon0q1PpMM7MQIvBY00kKCsQIIlsxhBT5w0Wa/uwMgDDW7BglTdyWHiuUiRwvr0pUuXSU81sXfm7BkdNoDiWQUTi1hhkVA+QYXDlulJzRQV5w9XMAorXqy4ClFs0cbAxHyt+dZVcVV0GB+PHKUbFVxkPOQ0a/ZsPcdTuXIla/KA25jMhlv99NCndDjulDKEGMWVuuXqmxPRgDFpidVoq1Yrt//SZf2wmDnu5B2xeyxoAHPkBc8H3DBvhNgyRpmY5MQyz3hlyOdYJkad5B+tNF7RXegFwompamFEnPJ6scQXk7hYrABJVqsMce8wx7dhwyZJSkzSneXC1DvnrZAW93zR4iXKc2nkm5tTYdj+/frhUNiCsBc61c1qxV89VScTDgsnY4R1UGc8JAmPeOq0GY6zO3XqpHz0v3+Vtm3aSPv2D8gZpeOoH1YFmuefdqiVi7Vq3atWVp1Qc0Nr/XnDQKPdjxv/mTYweDQAbQDndlB5QXC9WFGIVZ1JiYn+c7GBkBkGSJifgbeHlZK4H2i7uF9eFM8aETz8h18kdPrUutWAYGWWCW8B+l71dSeBnh1BGcEeNERD/IVybSdMnCifqX8jmBh7Rj03AoHS9+zeXZaoDu5vI0fq+GWD+vW1kpj0eO+kRu3o9KCQCNMMfPwx3UHimN0dx76cRFVHiz19586d9HwDyv+vN9/4yalQzl8NHy7jP/tMJk6e7D+O5YlYOGDEnu/t/b4teCATlEHFJCUE1zH4ySf1JLupmy+lyFNDBuu4+b59399azdZA/vzRX8zhgNds8umpngXAKAzLhDFSRYfXtUtnbUCQybPPDJVxn01Q9Zmk82zVsqVgpZHK2F9Gfmx4RXdx7dCxL6ZM1Ys0DAt0chgEmIl1pBmrVtiNnzBBJ8ECEKwUtOoClpcjtAOjjvuADtYs8XWK2+RnT4+5tVXq2YkZ6tmrDmrpsHkGxNQ31LvJ15qun/IQxo+foNsj9mM571dr1gTUDZNHASkglZWH9WC3rrL8yxVqiXmazhYLPMxCGqxQm690EroMlpgg3/yt7yFn9AUIe30xZYpeSYiTYRR+dmvBDD63VSHFPXv26iXTw57BYgXsvS3YN2HiJH87xdwp9gWa77DW/XYuebfl6V82xJfYTXxX3fgoyuDftnP83VkI5WCCuXz5cjrmb68WwgdwO80EnP04PiMNOsZIjLbs+SNvPKFsQhT24+YzPCuELOCNhEprzrG/IxyHsszIzH4c8Wd4XuhoTKhsxcpVKla9XP759d8FZWTPC5/x1D+YmQZjTYPrwX6752dNE8ltJ78K5zXdxcDl1KnTimFx/ZxFTjzAuJjyaAsVKpjTYb0P+o0J9JzuQ8CTHB5ACAn6GMm8UV/Mz9nn3hxWSesdrheG0ypO2jr0EufBo8hJcL2BjiE92hfuG1ZgRlqc6LDTMj3rieAC8MWIaYv2uv4m31AQ8HO5ufnyRXSY1aoF/joPKH8wA4L6IE00DIjJ24lRgFKaOYVQjAIdD9VhY1UXvmcMk5NV1UgsM/Oifm6mqRq1hWKUU5nBzolGI8upDrnZ5zXdhV5UqRJ8DiMYY3Pt0dJd5B+sQzXl5/Y93PoGYuKkrYfSy1DXC8Pn1vjlllM46e80r+HkFKVz8ZvoBQra/L0IlIU8kTclOgTQyF55+WV5WD04majivk2bNNZLTQeqifG7Rai7d8udvruv09PhLHNrIvkToybPF97sKvx5XEOD77khkJtQAHU3N2SZNq8I5EaHQ9XJ854ILgCdPTr9SHgkyIMGJJRa8HikCFB3I0WS+XiVgKfnRKzQ0BgrJZbWP2nr9tcOMQeCEEON+gnWrLlNAlElQN2NKl5mns8EYiKcZWeElS/45Tiny3+xjLfbwJRcTaLby+RnEjAEwgkFUHcNRb7nJ4FwdNhe75g0IuYi8Aty+AEg/H4Dvn7bfHsqvrsIXz2BJ4fx4Few50BMXnwnAacEItEAqbtOaTNdNAhEQodNvWLaiJiL4DsJ5CWBSDbAvKw3yyIBQyCSOhwTE+vmwvlOAiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRYBGJKZuFytLAiRAAt4iQCPirfvB2pAACZBATBGgEYmp28XKkgAJkIC3CNCIeOt+sDYkQAIkEFMEaERi6naxsiRAAiTgLQI0It66H6wNCZAACcQUARqRmLpdrCwJkAAJeIsAjYi37gdrQwIkQAIxRSBmfk8kpqiysncFAfMldnfFxfIiSSAAAXoiAcBwNwmQAAmQQGgC/Cr40IyYggRIgARIIAABeiIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgCNCKhGTEFCZAACZBAAAI0IgHAcDcJkAAJkEBoAjQioRkxBQmQAAmQQAACNCIBwHA3CZAACZBAaAI0IqEZMQUJkAAJkEAAAjQiAcBwNwmQAAmQQGgC/w/zX0lg9vhbHgAAAABJRU5ErkJggg=="},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/zh/assets/js/eec8f163.1b6cb3e8.js b/zh/assets/js/eec8f163.1b6cb3e8.js new file mode 100644 index 00000000000..b6aceafe666 --- /dev/null +++ b/zh/assets/js/eec8f163.1b6cb3e8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkportal=self.webpackChunkportal||[]).push([[9122],{5162:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),o=a(6010);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:a,className:i}=e;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,i),hidden:a},t)}},4866:(e,t,a)=>{a.d(t,{Z:()=>f});var n=a(7462),o=a(7294),r=a(6010),i=a(2466),l=a(6550),s=a(1980),p=a(7392),d=a(12);function k(e){return function(e){return o.Children.map(e,(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:o}}=e;return{value:t,label:a,attributes:n,default:o}}))}function c(e){const{values:t,children:a}=e;return(0,o.useMemo)((()=>{const e=t??k(a);return function(e){const t=(0,p.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function u(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,l.k6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(r),(0,o.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=c(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!u({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[s,p]=m({queryString:a,groupId:n}),[k,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,d.Nk)(a);return[n,(0,o.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),h=(()=>{const e=s??k;return u({value:e,tabValues:r})?e:null})();(0,o.useLayoutEffect)((()=>{h&&l(h)}),[h]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),g(e)}),[p,g,r]),tabValues:r}}var h=a(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:t,block:a,selectedValue:l,selectValue:s,tabValues:p}=e;const d=[],{blockElementScrollPositionUntilNextRender:k}=(0,i.o5)(),c=e=>{const t=e.currentTarget,a=d.indexOf(t),n=p[a].value;n!==l&&(k(t),s(n))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},p.map((e=>{let{value:t,label:a,attributes:i}=e;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>d.push(e),onKeyDown:u,onClick:c},i,{className:(0,r.Z)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":l===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=g(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",b.tabList)},o.createElement(N,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function f(e){const t=(0,h.Z)();return o.createElement(A,(0,n.Z)({key:String(t)},e))}},1003:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>k,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=a(7462),o=(a(7294),a(3905)),r=a(4866),i=a(5162),l=a(614);a(9960),a(1207);const s={title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},p=void 0,d={unversionedId:"farming-&-staking/staking/operators",id:"version-latest/farming-&-staking/staking/operators",title:"Operators guide",description:"Operators guide",source:"@site/i18n/zh/docusaurus-plugin-content-docs/version-latest/farming-&-staking/staking/operators.mdx",sourceDirName:"farming-&-staking/staking",slug:"/farming-&-staking/staking/operators",permalink:"/zh/docs/farming-&-staking/staking/operators",draft:!1,editUrl:"https://github.com/subspace/subspace-docs/blob/main/i18n/zh/docusaurus-plugin-content-docs/current/farming-&-staking/staking/operators.mdx",tags:[],version:"latest",sidebarPosition:2,frontMatter:{title:"Operators guide",sidebar_position:2,description:"Operators guide",keywords:["Operator","Guide"]},sidebar:"tutorialSidebar",previous:{title:"Introduction to Staking and Operators",permalink:"/zh/docs/farming-&-staking/staking/intro"},next:{title:"Staking guide",permalink:"/zh/docs/farming-&-staking/staking/"}},k={},c=[{value:"Check the list of the available domains:",id:"check-the-list-of-the-available-domains",level:3},{value:"Start the domain operator node",id:"start-the-domain-operator-node",level:3},{value:"Create operator key (recommended way)",id:"create-operator-key-recommended-way",level:4},{value:"Register an operator on domain",id:"register-an-operator-on-domain",level:3},{value:"Register an operator using Subspace Staking interface (recommended)",id:"register-an-operator-using-subspace-staking-interface-recommended",level:4},{value:"Register an operator using PolkadotJS interface",id:"register-an-operator-using-polkadotjs-interface",level:4},{value:"Checking your operatorId",id:"checking-your-operatorid",level:3},{value:"Embedded Docs",id:"embedded-docs",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Operator deregistration",id:"operator-deregistration",level:3},{value:"Operator deregistration using Subspace Staking interface (recommended)",id:"operator-deregistration-using-subspace-staking-interface-recommended",level:4},{value:"Operator deregistration using PolkadotJS",id:"operator-deregistration-using-polkadotjs",level:4},{value:"Operator Stake Withdrawal",id:"operator-stake-withdrawal",level:3},{value:"Create operator key (alternative, less secure way):",id:"create-operator-key-alternative-less-secure-way",level:3},{value:"Insert key to Keystore:",id:"insert-key-to-keystore",level:4},{value:"Switch domains",id:"switch-domains",level:3},{value:"Useful commands",id:"useful-commands",level:2},{value:"Running both validator (farmer) and operator nodes at the same time",id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time",level:3},{value:"Switching to another server",id:"switching-to-another-server",level:3}],u={toc:c},m="wrapper";function g(e){let{components:t,...s}=e;return(0,o.kt)(m,(0,n.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Currently, the domain chain does not support syncing from other operator nodes; it needs to be deterministically derived from the consensus chain block by block.")),(0,o.kt)("h3",{id:"check-the-list-of-the-available-domains"},"Check the list of the available domains:"),(0,o.kt)("p",null,"In order to participate in block production, operator needs to register on a specific domain."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Any account with the ",(0,o.kt)("strong",{parentName:"p"},"minimum operator stake")," can become an operator.")),(0,o.kt)("p",null,"To check the list of available domains:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Go to Developer -> Chain state\n",(0,o.kt)("img",{alt:"Staking-1",src:a(8576).Z,width:"1727",height:"343"})),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected state query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"domainRegistry")),(0,o.kt)("li",{parentName:"ol"},"Exclude ",(0,o.kt)("inlineCode",{parentName:"li"},"option")),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to query the chain state.\n",(0,o.kt)("img",{alt:"Staking-2",src:a(3538).Z,width:"1750",height:"409"})),(0,o.kt)("li",{parentName:"ol"},"Review the list of available domains\n",(0,o.kt)("img",{alt:"Staking-3",src:a(5006).Z,width:"1681",height:"356"}),(0,o.kt)("admonition",{parentName:"li",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the example above the number 3 corresponds to the domainId.\nThe example is not Stake Wars specific, the operator is responsible for finding out the correct domain ID they want to operate on. ",(0,o.kt)("strong",{parentName:"p"},"Stake Wars are using the domain with ID 1"),".")))),(0,o.kt)("h3",{id:"start-the-domain-operator-node"},"Start the domain operator node"),(0,o.kt)("h4",{id:"create-operator-key-recommended-way"},"Create operator key (recommended way)"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Make sure to have ",(0,o.kt)("a",{parentName:"li",href:"https://www.docker.com/get-started/"},"Docker installed"),".\nYou can run ",(0,o.kt)("inlineCode",{parentName:"li"},"docker -v")," in the terminal of your choice to make sure it's installed."),(0,o.kt)("li",{parentName:"ol"},"Start a developer node by running\n",(0,o.kt)("inlineCode",{parentName:"li"},"./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can use any chain to generate a keypair, we recommend using a ",(0,o.kt)("inlineCode",{parentName:"p"},"dev")," chain for simplicity.\nYou can adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," if you prefer to generate the keys in a different location.\\")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Start a local polkadot interface portal by running a docker contrainer.")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Proceed to the browswer and type ",(0,o.kt)("inlineCode",{parentName:"li"},"localhost")," in the search bar. You should be taken to the polkadot portal.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-2",src:a(4486).Z,width:"2880",height:"296"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Navigate to ",(0,o.kt)("inlineCode",{parentName:"p"},"developer")," -> ",(0,o.kt)("inlineCode",{parentName:"p"},"rpc calls"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Select ",(0,o.kt)("inlineCode",{parentName:"p"},"author")," in ",(0,o.kt)("inlineCode",{parentName:"p"},"call the selected endpoint")," and pick a ",(0,o.kt)("inlineCode",{parentName:"p"},"rotateKeys()")," in the dropdown."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"RPC-3",src:a(8974).Z,width:"2880",height:"672"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Press on ",(0,o.kt)("inlineCode",{parentName:"p"},"Submit RPC call"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You will see a newly generated key on the screen. The key will also be written in a ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," location you specified earlier."))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You will use this key in order to register an operator later.")),(0,o.kt)("p",null,"The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"subspace-node [consensus-chain-args] -- [domain-args]\n")),(0,o.kt)("p",null,"Example:\nStart a node as operator on ",(0,o.kt)("inlineCode",{parentName:"p"},"gemini-3g")," chain:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You need to wipe (",(0,o.kt)("inlineCode",{parentName:"p"},"purge-chain"),") and sync your node from genesis block, since you need to sync both consensus and domain chains.\nYou do not need to wipe any existing plots.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Ensure you replace ",(0,o.kt)("inlineCode",{parentName:"p"},"your_domain_id")," with your domain identifier in the command and ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," with your operator","_","id. If your keystore is located in a different folder, adjust the ",(0,o.kt)("inlineCode",{parentName:"p"},"--keystore-path")," accordingly. Setting ",(0,o.kt)("inlineCode",{parentName:"p"},"--base-path")," is optional.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can ignore setting up ",(0,o.kt)("inlineCode",{parentName:"p"},"your_operator_id")," while you're syncing your node. Make sure to set it after syncing and registration.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Stake Wars are using the domain ",(0,o.kt)("strong",{parentName:"p"},"Nova")," with ID ",(0,o.kt)("strong",{parentName:"p"},"1"),".")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --name your_node_name `\n --base-path your_path_to_node_data `\n -- `\n --domain-id your_domain_id `\n --chain gemini-3g `\n --operator-id your_operator_id`\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id yoir_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --name your_node_name \\\n --base-path your_path_to_node_data \\\n -- \\\n --domain-id your_domain_id \\\n --chain gemini-3g \\\n --operator-id your_operator_id\\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp \\\n --keystore-path /keystore"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-13",src:a(7469).Z,width:"1304",height:"730"})),(0,o.kt)("p",null,"To view the stored node information navigate to:"),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},"FOLDERID\\_LocalAppData e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`C:\\Users\\Alice\\AppData\\Local`\n"))),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},"$HOME/Library/Application Support e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`/Users/Alice/Library/Application Support`\n"))),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},"$XDG\\_DATA\\_HOME or /home/alice/.local/share e.g.",(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"`$HOME/.local/share`\n")))),(0,o.kt)("h3",{id:"register-an-operator-on-domain"},"Register an operator on domain"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It's crucial to fully sync your node before registering as an operator. Please follow the commands in the ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Start the domain operator"))," node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.")),(0,o.kt)("details",null,(0,o.kt)("summary",null,"Prefer a video? Expand for our installation video using PolkadotJS interface."),(0,o.kt)("div",null,(0,o.kt)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/w2U3CUJfI2c?si=mb-BRykmlrc49PPf",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowFullScreen:!0}))),(0,o.kt)("h4",{id:"register-an-operator-using-subspace-staking-interface-recommended"},"Register an operator using Subspace Staking interface (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-4",src:a(9459).Z,width:"604",height:"119"}),"\n5","."," Proceed to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake as a pool operator")," tab."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-5",src:a(9208).Z,width:"1531",height:"900"}),"\n6","."," Select the ",(0,o.kt)("inlineCode",{parentName:"p"},"domainId")," you would like to be registered on. Enter the ",(0,o.kt)("inlineCode",{parentName:"p"},"Minimum Operator Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Amount to Stake"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Nomination Tax")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"Signing key")," and then click ",(0,o.kt)("inlineCode",{parentName:"p"},"Next"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-6",src:a(3625).Z,width:"1532",height:"838"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step.")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"}),"\n8","."," Congratulations, you're now registered as an ",(0,o.kt)("strong",{parentName:"p"},"operator"),"!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(2653).Z,width:"1427",height:"785"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be registered and appear on the page.\nYou can check if the operator was created successfully by following the ",(0,o.kt)("a",{parentName:"p",href:"#checking-your-operatorid"},"steps"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can view some additional actions by clicking on ",(0,o.kt)("inlineCode",{parentName:"p"},"action")," next to your operator.\nYou can increase your stake, withdraw some stake and de-register your operator from there.")),(0,o.kt)("h4",{id:"register-an-operator-using-polkadotjs-interface"},"Register an operator using PolkadotJS interface"),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," to register an operator on the domain.\nTo register an operator on the domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Navigate to Developer -> Extrinsics."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"registerOperator(domainID, amount, config)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Enter the ",(0,o.kt)("inlineCode",{parentName:"li"},"domainId")," to be registered on."),(0,o.kt)("li",{parentName:"ol"},"Enter the desired staking amount in the ",(0,o.kt)("inlineCode",{parentName:"li"},"amount")," field."),(0,o.kt)("li",{parentName:"ol"},"Put your public signing key at the ",(0,o.kt)("inlineCode",{parentName:"li"},"signingKey")," field.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In the example below, 1 TSSC is selected for staking. 18 zeros are added because of the ",(0,o.kt)("inlineCode",{parentName:"p"},"u128")," type, so make sure to put 1000000000000000000 instead.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-5",src:a(3629).Z,width:"1742",height:"459"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to use the signing key generated on the previous ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"#create-operator-key"},"Create operator key"))," step")),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"minimumNominatorStake")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"1 TSSC"),"."),(0,o.kt)("li",{parentName:"ol"},"Enter ",(0,o.kt)("inlineCode",{parentName:"li"},"nominatorTax")," - in the example, it's set to ",(0,o.kt)("inlineCode",{parentName:"li"},"5%"),"."),(0,o.kt)("li",{parentName:"ol"},"Sign and submit the transaction to register an operator.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-6",src:a(3005).Z,width:"401",height:"78"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure to select ",(0,o.kt)("strong",{parentName:"p"},"Submit Transaction")," since the transaction needs to be signed.")),(0,o.kt)("p",null,"Once registered, the operator has to wait until the domain epoch is complete to start operating for the ",(0,o.kt)("strong",{parentName:"p"},"domain"),", participate in ",(0,o.kt)("strong",{parentName:"p"},"bundle production"),", and ",(0,o.kt)("strong",{parentName:"p"},"receive rewards"),"."),(0,o.kt)("p",null,"Once the domain epoch is finished, the operator can produce bundles from the new epoch."),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"operator")," can add more stake by using the same functionality."),(0,o.kt)("h3",{id:"checking-your-operatorid"},"Checking your operatorId"),(0,o.kt)("p",null,"There are two ways to check your operatorId:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"You can use PolkadotJS ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://polkadot.js.org/apps/#/explorer"},"Network Explorer")),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-7",src:a(8564).Z,width:"1761",height:"633"}),"\n2","."," Browse the ",(0,o.kt)("strong",{parentName:"p"},"recent events")," and you should see ",(0,o.kt)("strong",{parentName:"p"},"domains.OperatorRegistered")," event."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-8",src:a(7921).Z,width:"849",height:"166"}),"\n3","."," Click on the dropdown arrow to view the ",(0,o.kt)("strong",{parentName:"p"},"domainId")," and ",(0,o.kt)("strong",{parentName:"p"},"operatorId"),"."),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Alternatively, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/"},"Subscan")," which is a little easier to navigate for this job."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Navigate to ",(0,o.kt)("strong",{parentName:"li"},(0,o.kt)("a",{parentName:"strong",href:"https://subspace.subscan.io/"},"Subspace Subscan"))," portal."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Blockchain")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Extrinsics"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-9",src:a(8874).Z,width:"1203",height:"341"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Scroll to the bottom of the page to view all recent events, search for ",(0,o.kt)("inlineCode",{parentName:"li"},"register_operator")," event.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-10",src:a(1074).Z,width:"1204",height:"396"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Click on ",(0,o.kt)("inlineCode",{parentName:"p"},"Extrinsic ID")," for the desired event.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"p"},"Parameters")," and ensure that ",(0,o.kt)("inlineCode",{parentName:"p"},"signing_key")," corresponds to your signing key."))),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-11",src:a(5212).Z,width:"1163",height:"572"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Scroll to ",(0,o.kt)("inlineCode",{parentName:"li"},"Events")," and click on dropdown arrow for ",(0,o.kt)("inlineCode",{parentName:"li"},"domains(OperatorRegistered)"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-12",src:a(2610).Z,width:"1198",height:"567"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Inspect and remember your ",(0,o.kt)("inlineCode",{parentName:"li"},"domain_id"),".")),(0,o.kt)("h3",{id:"embedded-docs"},"Embedded Docs"),(0,o.kt)("p",null,"The following command can be used to explore all parameters and subcommands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node --help\n")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"If you prefer to build from the source rather using existing builds, the domain operator node is embedded within the ",(0,o.kt)("inlineCode",{parentName:"p"},"subspace-node")," binary, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/subspace/subspace/blob/main/crates/subspace-node/README.md"},"Subspace node")," for how to build from source."),(0,o.kt)("h3",{id:"operator-deregistration"},"Operator deregistration"),(0,o.kt)("p",null,"To deregister an operator on the domain and have your tokens released:"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Only account who registered an operator can deregister it. Make sure to use the same wallet / account to sign the transaction for deregistration.")),(0,o.kt)("h4",{id:"operator-deregistration-using-subspace-staking-interface-recommended"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"Subspace Staking interface")," (recommended)"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to the ",(0,o.kt)("a",{parentName:"li",href:"https://staking.subspace.tools"},"Subspace Staking portal")," and connect your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-1",src:a(3693).Z,width:"1358",height:"898"})),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Select the wallet you would like to connect. Make sure to select the wallet you registered your operator with. Both ",(0,o.kt)("strong",{parentName:"li"},"Subwallet")," and ",(0,o.kt)("strong",{parentName:"li"},"PolkadotJS")," wallets are supported.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-2",src:a(142).Z,width:"450",height:"350"})),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Enter your password to give an access to your wallet.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-3",src:a(646).Z,width:"390",height:"633"})),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Manage your stake"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-9",src:a(6252).Z,width:"1382",height:"904"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"Action")," button next to an operator you would like to deregister and select ",(0,o.kt)("inlineCode",{parentName:"li"},"deregister"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-10",src:a(153).Z,width:"363",height:"176"})),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Approve the request in the pop-up window.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NStaking-8",src:a(1314).Z,width:"390",height:"626"})),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Congratulations, your operator was deregistered.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"It can take up to 10 minutes for the operator to be deregistered and disappeared from the page.\nYou can check if the operator was deregistered successfully on the ",(0,o.kt)("a",{parentName:"p",href:"https://subspace.subscan.io/extrinsic"},"Subspace Subscan portal"),".")),(0,o.kt)("h4",{id:"operator-deregistration-using-polkadotjs"},"Operator deregistration using ",(0,o.kt)("strong",{parentName:"h4"},"PolkadotJS")),(0,o.kt)("p",null,"Alternatively, you can use the ",(0,o.kt)("strong",{parentName:"p"},"PolkadotJS")," portal to deregister operator."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"deregisterOperator(operatorId)")," in the dropdown.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-14",src:a(8964).Z,width:"1722",height:"391"})),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Your tokens and tokens of operator ",(0,o.kt)("inlineCode",{parentName:"li"},"Nominators")," will be released after the ",(0,o.kt)("inlineCode",{parentName:"li"},"lockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"To check the locking period you can go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Developer")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Chain state")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Constants"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"selected contant query")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"stakeWithdrawalLockingPeriod"),"."),(0,o.kt)("li",{parentName:"ol"},"Click on ",(0,o.kt)("inlineCode",{parentName:"li"},"+")," to run the query.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-15",src:a(5104).Z,width:"1740",height:"327"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Number 256 above corresponds to the number of the domain blocks, and not the consensus chain blocks.")),(0,o.kt)("h3",{id:"operator-stake-withdrawal"},"Operator Stake Withdrawal"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operator")," stake withdrawal works similarly to ",(0,o.kt)("strong",{parentName:"p"},"Nominator")," stake withdrawal. Refer to ",(0,o.kt)("a",{parentName:"p",href:"/zh/docs/farming-&-staking/staking/#stake-withdrawal-using-polkadotjs"},"this section")," to withdraw your stake."),(0,o.kt)("h3",{id:"create-operator-key-alternative-less-secure-way"},"Create operator key (alternative, less secure way):"),(0,o.kt)("p",null,"An operator needs a key pair to participate in bundle production.\nYou can create a key using the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"target/production/subspace-node key generate --scheme sr25519\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-4",src:a(5158).Z,width:"856",height:"121"})),(0,o.kt)("p",null,"Back up the key. Take the ",(0,o.kt)("inlineCode",{parentName:"p"},"public key (hex)")," of the Keypair. The public key is part of the operator config we will be using later on ",(0,o.kt)("a",{parentName:"p",href:"https://staking.subspace.tools"},"Staking portal")," or ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS portal"),"."),(0,o.kt)("h4",{id:"insert-key-to-keystore"},"Insert key to Keystore:"),(0,o.kt)("p",null,"The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production."),(0,o.kt)("p",null,"To insert the key, use the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'target/production/subspace-node key insert \\\n--suri "" --key-type oper --scheme sr25519 --keystore-path /keystore\n')),(0,o.kt)("p",null,"The command above assumes ",(0,o.kt)("inlineCode",{parentName:"p"},"/keystore")," as the keystore location.\n",(0,o.kt)("inlineCode",{parentName:"p"},"suri")," is the secret phrase of the operator key."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"tmp")," folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\\")),(0,o.kt)("h3",{id:"switch-domains"},"Switch domains"),(0,o.kt)("p",null,"Any ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can switch domain they operate on anytime.\nIn order to switch domain:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Proceed to ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS")),(0,o.kt)("li",{parentName:"ol"},"Make sure to select the correct network at the top-left corner."),(0,o.kt)("li",{parentName:"ol"},"Select the account you want to use in ",(0,o.kt)("inlineCode",{parentName:"li"},"using the selected account"),"."),(0,o.kt)("li",{parentName:"ol"},"Select ",(0,o.kt)("inlineCode",{parentName:"li"},"domains")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"submit the following extrinsic")," and choose ",(0,o.kt)("inlineCode",{parentName:"li"},"switchDomain(operatorId, newDomainId)")," in the dropdown."),(0,o.kt)("li",{parentName:"ol"},"Add your ",(0,o.kt)("inlineCode",{parentName:"li"},"operatorId")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"newDomainId")," to the corresponding fields.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-24",src:a(7700).Z,width:"1754",height:"566"})),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Only the account who registered ",(0,o.kt)("strong",{parentName:"p"},"Operator")," can swith the domain.")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Stake of your ",(0,o.kt)("strong",{parentName:"p"},"Nominators")," won't be released, but will be moved to the new domain as well.")),(0,o.kt)("h2",{id:"useful-commands"},"Useful commands"),(0,o.kt)("h3",{id:"running-both-validator-farmer-and-operator-nodes-at-the-same-time"},"Running both validator (farmer) and operator nodes at the same time"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.")),(0,o.kt)(r.Z,{groupId:"OS",mdxType:"Tabs"},(0,o.kt)(i.Z,{value:"windows",label:"\ud83d\uddbc\ufe0f Windows",default:!0,mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node `\n --chain gemini-3g `\n --blocks-pruning 256 `\n --state-pruning archive `\n --no-private-ipv4 `\n --validator `\n --name your_node_name `\n -- `\n --domain-id your_domain_id `\n --operator-id your_operator_id`\n --keystore-path /keystore `\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"macos",label:"\ud83c\udf4e macOS",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp")),(0,o.kt)(i.Z,{value:"linux",label:"\ud83d\udc27 Ubuntu",mdxType:"TabItem"},(0,o.kt)(l.Z,{mdxType:"CodeBlock"},"target/production/subspace-node \\\n --chain gemini-3g \\\n --blocks-pruning 256 \\\n --state-pruning archive \\\n --no-private-ipv4 \\\n --validator \\\n --name your_node_name \\\n -- \\\n --domain-id your_domain_id \\\n --operator-id your_operator_id\\\n --keystore-path /keystore \\\n --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp"))),(0,o.kt)("p",null,"You should see the node start successfully and begin syncing."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Staking-28",src:a(2567).Z,width:"1306",height:"689"})),(0,o.kt)("h3",{id:"switching-to-another-server"},"Switching to another server"),(0,o.kt)("p",null,"To ensure the minimum downtown during your switch, we propose the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore."),(0,o.kt)("li",{parentName:"ol"},"Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key)."),(0,o.kt)("li",{parentName:"ol"},"Update the keystore on the new node with the original signing key."),(0,o.kt)("li",{parentName:"ol"},"Restart the new operator node.")))}g.isMDXComponent=!0},1207:(e,t,a)=>{a.d(t,{Z:()=>n});const n={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"}},3693:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-1-52b2c721c633035f4253f8953eff68bf.png"},153:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-10-f193689a3b580665e6dc054d32ec336b.png"},142:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-2-a1a2a842aababae871f04661ed4eab24.png"},646:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-3-ca3a0b86ffb2f19484b74d059021a3ce.png"},9459:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-4-762ba84f9529de3fd02b9e3e1b8e31ba.png"},9208:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-5-eaf4de62552c35afc3e1455826ef78e8.png"},3625:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-6-c8a56a91e88a562936916225fe35aa68.png"},1314:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-7-b438b3e26eaefccdf0bc47f2a4793cf7.png"},2653:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-8-8699a39a8ca94dbf0849e512a068d1a7.png"},6252:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/NStaking-9-b49b1cab8a09ef283763798a61a25383.png"},4486:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-2-5fc9adc9c58a364bba891c51f6de986a.png"},8974:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/RPC-3-e717ed7fc5f5154888e2f8d2b7647024.png"},8576:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-1-9f2da1385d13542df8eb8f768cf9edc4.png"},1074:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-10-88e139724c36663dd8409f536f5994be.png"},5212:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-11-ab69a1f032df85f3e2c7004620adfbff.png"},2610:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-12-a51c5ea7df0799e4ea7b9e0926efd2dd.png"},7469:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-13-08a79594c56d19dbdd2b8d71764ef5fd.png"},8964:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-14-448399b7e390a9fdb4399899369a83ef.png"},5104:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-15-b609655e36be30a0c4b51c9aeab2bb78.png"},3538:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-2-010d361e7788d70a9122c18a88125269.png"},7700:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-24-b822133034d0db2dfee16f639920c99b.png"},2567:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-28-21a5dd73ef671f679b80c053023f6fe8.png"},5006:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-3-566d70ecad0ab415603e6736b707bdc0.png"},5158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-4-96a308e746d184f1cc2596bbeea1530d.png"},3629:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-5-37d32f0a7918bed82a28d07e91a0861a.png"},3005:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},8564:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-7-255ba039078a485a7cb7e6a848fe5e9e.png"},7921:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-8-ba441aa6feb58db4a78af68431102aa9.png"},8874:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/Staking-9-67edafdb834fc435f6ce1f63b06d973b.png"}}]); \ No newline at end of file diff --git a/zh/assets/js/runtime~main.e12c45e6.js b/zh/assets/js/runtime~main.4dcb7439.js similarity index 98% rename from zh/assets/js/runtime~main.e12c45e6.js rename to zh/assets/js/runtime~main.4dcb7439.js index fb35a6aa0a6..6cc280ae7ad 100644 --- a/zh/assets/js/runtime~main.e12c45e6.js +++ b/zh/assets/js/runtime~main.4dcb7439.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,f,c,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,c,d)=>{if(!f){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",122:"8fcf7eed",315:"bdd9f60e",325:"ead368e9",338:"db6dc80d",446:"dc422af7",592:"bbdb6abe",707:"78cca72d",839:"b53de32a",897:"620d7f6b",959:"63e41407",1618:"83780314",1689:"cadf5aed",1927:"208803fd",2125:"fdcc9511",2236:"f4278384",2300:"69a425e9",2333:"285f32e8",2342:"ec3b75ae",2360:"114fbca4",2381:"9f901625",2444:"6568afda",2469:"87617bb5",2519:"3f84eb80",3033:"7eebd924",3085:"1f391b9e",3153:"f7e5b3db",3191:"a6acbc85",3228:"5cb26121",3235:"da6f36cd",3237:"1df93b7f",3252:"3b2f8a40",3280:"ef42b41f",3306:"46e922a4",3747:"192e334c",3814:"3c60258d",3843:"93d11967",4036:"9ae7a897",4071:"5bded117",4184:"41457e10",4417:"f22ad08c",4582:"9741dab9",4610:"2356a88a",4729:"e5f99a35",4818:"8d6e6373",4842:"53a2642c",4956:"d7758d3d",4969:"b72928c5",4992:"2894ef4b",5268:"bf700ca5",5350:"45648a08",5413:"8eea4b82",5571:"7c807a75",5747:"61bf88e8",5888:"da767587",5905:"cb958de3",6103:"71a55d63",6136:"c0125dee",6233:"c60f7eca",6256:"65460f7c",6339:"3a19fffb",6452:"f408bab8",6521:"86c90315",6529:"41e73915",6572:"90543902",6741:"5e1c30c8",6928:"79420c3b",6989:"a88a6810",7043:"933a92b2",7046:"94df17ee",7158:"1cf5d779",7370:"c09f4ff7",7414:"393be207",7650:"ba11bf3c",7720:"34412edf",7918:"17896441",8121:"1bab44ee",8388:"cb4d3935",8519:"5a27bc23",8715:"a248a023",8788:"0c973eea",8979:"c7af8654",9039:"d6194645",9122:"eec8f163",9214:"21235983",9312:"8f56341b",9362:"3929c9df",9370:"d8b3ea14",9430:"a7efa161",9476:"6ac8c480",9514:"1be78505",9527:"b2a1b465",9686:"f4ec668f",9770:"d8ef6997",9805:"1acd8a2f",9817:"14eb3368",9848:"f632d8fe",9917:"59820261"}[e]||e)+"."+{53:"87f0be4d",122:"ce84f96d",315:"d65f4562",325:"511fe220",338:"c2a3c6e6",446:"5072331d",592:"cd283e8d",707:"dc51243a",814:"dc8c3a26",839:"f205b89b",897:"25841d3d",959:"fffd5e56",1618:"24915163",1689:"6af3f868",1927:"610efa43",2125:"a0154653",2236:"02133ae0",2300:"0c43a098",2333:"b3291a14",2342:"3d1b7560",2360:"a3847724",2381:"6722331c",2444:"72e04d1f",2469:"f23b29b2",2519:"8c5dfabb",3033:"6642e93d",3085:"3a447380",3153:"7a86f398",3191:"15536cdb",3203:"c0b8bfe8",3228:"fb198cfe",3235:"4cee896d",3237:"b8ec0c1b",3252:"2fc74a50",3280:"a28d7ef7",3306:"9c000d7d",3473:"fdffa07c",3747:"ba8ea0f8",3814:"083fd00d",3843:"d92798b6",4036:"6912db58",4071:"d10648f9",4184:"05f0d293",4417:"1d065705",4582:"944adff8",4610:"8deeb587",4729:"add9ee8b",4818:"ccf4713c",4842:"8e1e31eb",4956:"aaa5a2c9",4969:"01a62c14",4972:"4a54fd4a",4992:"d84087f8",5268:"fa7c7f19",5350:"5c8d8622",5413:"bde1dfa2",5571:"a7c45cf1",5747:"055ff006",5888:"90fe7060",5905:"d46e22cc",6103:"7380a739",6136:"b7a480bf",6233:"9394ad70",6256:"80c41254",6339:"dc9ede67",6452:"f3a00d05",6521:"d5c6ef8d",6529:"b8d1fd9f",6572:"a7b52ec2",6741:"e9186435",6928:"cc88cb7d",6989:"15762ed0",7043:"062268a3",7046:"24455e71",7158:"50e9339b",7370:"cf01b91d",7414:"7b2d683b",7650:"51d3ef43",7720:"c89bf200",7918:"e3da5265",8121:"2f550fb1",8388:"f65d1387",8519:"9722569b",8715:"fdece28e",8788:"df55022f",8979:"b62917a1",9039:"6484c0e3",9122:"1384e9c8",9214:"62769a0c",9312:"70647eb1",9362:"486153d6",9370:"63dc3a17",9430:"8cd4b5b1",9476:"b8eabc32",9514:"478c02c6",9527:"bd941419",9686:"f7029322",9770:"9f8754b4",9805:"f3e38880",9817:"b7ea7ab7",9848:"d5408ede",9917:"edfc5a7a"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="portal:",r.l=(e,a,f,b)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/zh/",r.gca=function(e){return e={17896441:"7918",21235983:"9214",59820261:"9917",83780314:"1618",90543902:"6572","935f2afb":"53","8fcf7eed":"122",bdd9f60e:"315",ead368e9:"325",db6dc80d:"338",dc422af7:"446",bbdb6abe:"592","78cca72d":"707",b53de32a:"839","620d7f6b":"897","63e41407":"959",cadf5aed:"1689","208803fd":"1927",fdcc9511:"2125",f4278384:"2236","69a425e9":"2300","285f32e8":"2333",ec3b75ae:"2342","114fbca4":"2360","9f901625":"2381","6568afda":"2444","87617bb5":"2469","3f84eb80":"2519","7eebd924":"3033","1f391b9e":"3085",f7e5b3db:"3153",a6acbc85:"3191","5cb26121":"3228",da6f36cd:"3235","1df93b7f":"3237","3b2f8a40":"3252",ef42b41f:"3280","46e922a4":"3306","192e334c":"3747","3c60258d":"3814","93d11967":"3843","9ae7a897":"4036","5bded117":"4071","41457e10":"4184",f22ad08c:"4417","9741dab9":"4582","2356a88a":"4610",e5f99a35:"4729","8d6e6373":"4818","53a2642c":"4842",d7758d3d:"4956",b72928c5:"4969","2894ef4b":"4992",bf700ca5:"5268","45648a08":"5350","8eea4b82":"5413","7c807a75":"5571","61bf88e8":"5747",da767587:"5888",cb958de3:"5905","71a55d63":"6103",c0125dee:"6136",c60f7eca:"6233","65460f7c":"6256","3a19fffb":"6339",f408bab8:"6452","86c90315":"6521","41e73915":"6529","5e1c30c8":"6741","79420c3b":"6928",a88a6810:"6989","933a92b2":"7043","94df17ee":"7046","1cf5d779":"7158",c09f4ff7:"7370","393be207":"7414",ba11bf3c:"7650","34412edf":"7720","1bab44ee":"8121",cb4d3935:"8388","5a27bc23":"8519",a248a023:"8715","0c973eea":"8788",c7af8654:"8979",d6194645:"9039",eec8f163:"9122","8f56341b":"9312","3929c9df":"9362",d8b3ea14:"9370",a7efa161:"9430","6ac8c480":"9476","1be78505":"9514",b2a1b465:"9527",f4ec668f:"9686",d8ef6997:"9770","1acd8a2f":"9805","14eb3368":"9817",f632d8fe:"9848"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,c,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,c,d)=>{if(!f){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",122:"8fcf7eed",315:"bdd9f60e",325:"ead368e9",338:"db6dc80d",446:"dc422af7",592:"bbdb6abe",707:"78cca72d",839:"b53de32a",897:"620d7f6b",959:"63e41407",1618:"83780314",1689:"cadf5aed",1927:"208803fd",2125:"fdcc9511",2236:"f4278384",2300:"69a425e9",2333:"285f32e8",2342:"ec3b75ae",2360:"114fbca4",2381:"9f901625",2444:"6568afda",2469:"87617bb5",2519:"3f84eb80",3033:"7eebd924",3085:"1f391b9e",3153:"f7e5b3db",3191:"a6acbc85",3228:"5cb26121",3235:"da6f36cd",3237:"1df93b7f",3252:"3b2f8a40",3280:"ef42b41f",3306:"46e922a4",3747:"192e334c",3814:"3c60258d",3843:"93d11967",4036:"9ae7a897",4071:"5bded117",4184:"41457e10",4417:"f22ad08c",4582:"9741dab9",4610:"2356a88a",4729:"e5f99a35",4818:"8d6e6373",4842:"53a2642c",4956:"d7758d3d",4969:"b72928c5",4992:"2894ef4b",5268:"bf700ca5",5350:"45648a08",5413:"8eea4b82",5571:"7c807a75",5747:"61bf88e8",5888:"da767587",5905:"cb958de3",6103:"71a55d63",6136:"c0125dee",6233:"c60f7eca",6256:"65460f7c",6339:"3a19fffb",6452:"f408bab8",6521:"86c90315",6529:"41e73915",6572:"90543902",6741:"5e1c30c8",6928:"79420c3b",6989:"a88a6810",7043:"933a92b2",7046:"94df17ee",7158:"1cf5d779",7370:"c09f4ff7",7414:"393be207",7650:"ba11bf3c",7720:"34412edf",7918:"17896441",8121:"1bab44ee",8388:"cb4d3935",8519:"5a27bc23",8715:"a248a023",8788:"0c973eea",8979:"c7af8654",9039:"d6194645",9122:"eec8f163",9214:"21235983",9312:"8f56341b",9362:"3929c9df",9370:"d8b3ea14",9430:"a7efa161",9476:"6ac8c480",9514:"1be78505",9527:"b2a1b465",9686:"f4ec668f",9770:"d8ef6997",9805:"1acd8a2f",9817:"14eb3368",9848:"f632d8fe",9917:"59820261"}[e]||e)+"."+{53:"87f0be4d",122:"ce84f96d",315:"d65f4562",325:"511fe220",338:"c2a3c6e6",446:"5072331d",592:"cd283e8d",707:"dc51243a",814:"dc8c3a26",839:"f205b89b",897:"25841d3d",959:"fffd5e56",1618:"24915163",1689:"6af3f868",1927:"610efa43",2125:"a0154653",2236:"02133ae0",2300:"0c43a098",2333:"b3291a14",2342:"3d1b7560",2360:"a3847724",2381:"6722331c",2444:"72e04d1f",2469:"f23b29b2",2519:"8c5dfabb",3033:"6642e93d",3085:"3a447380",3153:"7a86f398",3191:"15536cdb",3203:"c0b8bfe8",3228:"fb198cfe",3235:"4cee896d",3237:"b8ec0c1b",3252:"2fc74a50",3280:"a28d7ef7",3306:"9c000d7d",3473:"fdffa07c",3747:"ba8ea0f8",3814:"083fd00d",3843:"d92798b6",4036:"6912db58",4071:"d10648f9",4184:"05f0d293",4417:"1d065705",4582:"944adff8",4610:"8deeb587",4729:"add9ee8b",4818:"ccf4713c",4842:"8e1e31eb",4956:"aaa5a2c9",4969:"01a62c14",4972:"4a54fd4a",4992:"d84087f8",5268:"fa7c7f19",5350:"5c8d8622",5413:"bde1dfa2",5571:"a7c45cf1",5747:"055ff006",5888:"90fe7060",5905:"d46e22cc",6103:"7380a739",6136:"b7a480bf",6233:"9394ad70",6256:"80c41254",6339:"dc9ede67",6452:"f3a00d05",6521:"d5c6ef8d",6529:"9fa4eced",6572:"a7b52ec2",6741:"e9186435",6928:"cc88cb7d",6989:"15762ed0",7043:"062268a3",7046:"24455e71",7158:"50e9339b",7370:"cf01b91d",7414:"7b2d683b",7650:"51d3ef43",7720:"c89bf200",7918:"e3da5265",8121:"2f550fb1",8388:"f65d1387",8519:"9722569b",8715:"fdece28e",8788:"df55022f",8979:"b62917a1",9039:"6484c0e3",9122:"1b6cb3e8",9214:"62769a0c",9312:"70647eb1",9362:"486153d6",9370:"63dc3a17",9430:"8cd4b5b1",9476:"b8eabc32",9514:"478c02c6",9527:"bd941419",9686:"f7029322",9770:"9f8754b4",9805:"f3e38880",9817:"b7ea7ab7",9848:"d5408ede",9917:"edfc5a7a"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="portal:",r.l=(e,a,f,b)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/zh/",r.gca=function(e){return e={17896441:"7918",21235983:"9214",59820261:"9917",83780314:"1618",90543902:"6572","935f2afb":"53","8fcf7eed":"122",bdd9f60e:"315",ead368e9:"325",db6dc80d:"338",dc422af7:"446",bbdb6abe:"592","78cca72d":"707",b53de32a:"839","620d7f6b":"897","63e41407":"959",cadf5aed:"1689","208803fd":"1927",fdcc9511:"2125",f4278384:"2236","69a425e9":"2300","285f32e8":"2333",ec3b75ae:"2342","114fbca4":"2360","9f901625":"2381","6568afda":"2444","87617bb5":"2469","3f84eb80":"2519","7eebd924":"3033","1f391b9e":"3085",f7e5b3db:"3153",a6acbc85:"3191","5cb26121":"3228",da6f36cd:"3235","1df93b7f":"3237","3b2f8a40":"3252",ef42b41f:"3280","46e922a4":"3306","192e334c":"3747","3c60258d":"3814","93d11967":"3843","9ae7a897":"4036","5bded117":"4071","41457e10":"4184",f22ad08c:"4417","9741dab9":"4582","2356a88a":"4610",e5f99a35:"4729","8d6e6373":"4818","53a2642c":"4842",d7758d3d:"4956",b72928c5:"4969","2894ef4b":"4992",bf700ca5:"5268","45648a08":"5350","8eea4b82":"5413","7c807a75":"5571","61bf88e8":"5747",da767587:"5888",cb958de3:"5905","71a55d63":"6103",c0125dee:"6136",c60f7eca:"6233","65460f7c":"6256","3a19fffb":"6339",f408bab8:"6452","86c90315":"6521","41e73915":"6529","5e1c30c8":"6741","79420c3b":"6928",a88a6810:"6989","933a92b2":"7043","94df17ee":"7046","1cf5d779":"7158",c09f4ff7:"7370","393be207":"7414",ba11bf3c:"7650","34412edf":"7720","1bab44ee":"8121",cb4d3935:"8388","5a27bc23":"8519",a248a023:"8715","0c973eea":"8788",c7af8654:"8979",d6194645:"9039",eec8f163:"9122","8f56341b":"9312","3929c9df":"9362",d8b3ea14:"9370",a7efa161:"9430","6ac8c480":"9476","1be78505":"9514",b2a1b465:"9527",f4ec668f:"9686",d8ef6997:"9770","1acd8a2f":"9805","14eb3368":"9817",f632d8fe:"9848"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n - + - + \ No newline at end of file diff --git a/zh/docs/category/advanced-cli/index.html b/zh/docs/category/advanced-cli/index.html index 2ebd36ff95c..186b7458ee4 100644 --- a/zh/docs/category/advanced-cli/index.html +++ b/zh/docs/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/category/develop-on-nova-evm-/index.html b/zh/docs/category/develop-on-nova-evm-/index.html index bb22a80537f..46a669c099f 100644 --- a/zh/docs/category/develop-on-nova-evm-/index.html +++ b/zh/docs/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/zh/docs/category/develop/index.html b/zh/docs/category/develop/index.html index 2e9a3204b2b..db2b9b1d908 100644 --- a/zh/docs/category/develop/index.html +++ b/zh/docs/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/category/farming/index.html b/zh/docs/category/farming/index.html index 77ed543e273..0061448dc9c 100644 --- a/zh/docs/category/farming/index.html +++ b/zh/docs/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/category/learn/index.html b/zh/docs/category/learn/index.html index 52b23bd31db..96bfb12fce7 100644 --- a/zh/docs/category/learn/index.html +++ b/zh/docs/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/category/operators-and-nominators/index.html b/zh/docs/category/operators-and-nominators/index.html index cd2b344bd32..b42a28538e1 100644 --- a/zh/docs/category/operators-and-nominators/index.html +++ b/zh/docs/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/category/participate/index.html b/zh/docs/category/participate/index.html index 1562e6b1c29..c46c2aac6e6 100644 --- a/zh/docs/category/participate/index.html +++ b/zh/docs/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/category/pulsar-recommended/index.html b/zh/docs/category/pulsar-recommended/index.html index 764d943fb03..996e2ba1d24 100644 --- a/zh/docs/category/pulsar-recommended/index.html +++ b/zh/docs/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/category/wallets/index.html b/zh/docs/category/wallets/index.html index 87ee8c3c287..c6ef335c141 100644 --- a/zh/docs/category/wallets/index.html +++ b/zh/docs/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/develop/nova/block_explorer/index.html b/zh/docs/develop/nova/block_explorer/index.html index c3c531b799e..f58829f50b5 100644 --- a/zh/docs/develop/nova/block_explorer/index.html +++ b/zh/docs/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/develop/nova/faucet/index.html b/zh/docs/develop/nova/faucet/index.html index 1c845193b3f..6800035f1c7 100644 --- a/zh/docs/develop/nova/faucet/index.html +++ b/zh/docs/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/zh/docs/develop/nova/foundry_guide/index.html b/zh/docs/develop/nova/foundry_guide/index.html index e9a7d22b431..680c37cc9c0 100644 --- a/zh/docs/develop/nova/foundry_guide/index.html +++ b/zh/docs/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/zh/docs/develop/nova/general-information/index.html b/zh/docs/develop/nova/general-information/index.html index 702f3e978ec..a8d2e969d6a 100644 --- a/zh/docs/develop/nova/general-information/index.html +++ b/zh/docs/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    版本:最近

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/zh/docs/develop/nova/hardhat_guide/index.html b/zh/docs/develop/nova/hardhat_guide/index.html index 0fbc28a7db9..fe24d58b191 100644 --- a/zh/docs/develop/nova/hardhat_guide/index.html +++ b/zh/docs/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/zh/docs/develop/nova/intro/index.html b/zh/docs/develop/nova/intro/index.html index d9654df46f3..e3e8d335d0d 100644 --- a/zh/docs/develop/nova/intro/index.html +++ b/zh/docs/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/zh/docs/develop/nova/local_development/index.html b/zh/docs/develop/nova/local_development/index.html index 05c41555c49..e3a9ae561e9 100644 --- a/zh/docs/develop/nova/local_development/index.html +++ b/zh/docs/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    版本:最近

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/zh/docs/develop/nova/quick_start/index.html b/zh/docs/develop/nova/quick_start/index.html index e7a267d2375..ab6475ee85b 100644 --- a/zh/docs/develop/nova/quick_start/index.html +++ b/zh/docs/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    版本:最近

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/zh/docs/develop/nova/remix_guide/index.html b/zh/docs/develop/nova/remix_guide/index.html index 2a5e0d8a0bc..890f0588618 100644 --- a/zh/docs/develop/nova/remix_guide/index.html +++ b/zh/docs/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/zh/docs/develop/nova/setting-up-metamask/index.html b/zh/docs/develop/nova/setting-up-metamask/index.html index 7541d21d846..93a7ccbdadb 100644 --- a/zh/docs/develop/nova/setting-up-metamask/index.html +++ b/zh/docs/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/zh/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 32be66b664a..20e2cdf8b8f 100644 --- a/zh/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/zh/docs/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. 1.这将在顶部显示你的家庭路由器的 IP 地址
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. 某些 ISP 将其配置为你的 ISP 门户帐户登录信息。

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html b/zh/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html index 17b9fca50b1..54c46fd2ec5 100644 --- a/zh/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/zh/docs/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/zh/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index c784bb44ba4..8b8cab651d7 100644 --- a/zh/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/zh/docs/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    版本:最近

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    加密 钱包

    Before running anything you need to have a wallet where you'll receive testnet coins. 目前我们建议使用两种钱包,SubWallet 是首选途径。

    将上述两个钱包之一安装到你的浏览器中,并在其中创建一个新帐户。最后一步需要你的帐户地址 您的帐户地址在最后一步是必要的

    如需帮助,请参阅我们的论坛帖子如何设置 Subwallet 和 Polkadot.js 钱包

    • 请务必遵循上面帖子底部的奖励部分。

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/zh/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 1ae39b31d66..f60ea98f486 100644 --- a/zh/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/zh/docs/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    版本:最近

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    使用自定义路径

    如果你想使用外部硬盘驱动器,你可以为你的 Node\&Farmer 设置一个自定义路径,或者从默认设置一个自定义路径。 如果您喜欢,您可以将节点和农场主设置为不同的目录。

    #### 设置节点自定义路径。
    要将节点设置为使用自定义路径,只需添加 `--base-path` 参数。

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    从子空间的旧/不同版本切换到新快照

    info

    除非开发团队特别提到,否则您不应该不必在新版本上擦除和清除您的配置。

    通常,你应该能够下载最新版本,并使用与以前版本相同的命令重新启动 Node\&Farmer,而不会出现任何错误。

    在某些情况下,版本更新会导致你的节点和农民出现问题,你可能必须擦除和清除你的节点,通常是在发生错误时, 如果您有任何问题,您总是可以在我们的 Forums和连接到我们的 Discord 服务器寻求帮助。

    帮助

    你可以在 Farmer 或 Node 上使用额外的命令和参数,在 --help 任何其他命令之后使用以显示其他选项。

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    示例:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/zh/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index dd223bdf09c..378ae0a4666 100644 --- a/zh/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/zh/docs/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,14 +7,14 @@ - +
    版本:最近

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    擦除和清除

    如果你之前正在运行节点,并希望切换到新的快照,请执行以下步骤,然后再次遵循指导原则:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    无论 Node/Farmer 可执行文件是以前的还是来自新的快照,两者都可以工作:) 我们需要这样做的原因是,每次快照更改时,网络可能会被分区,并且你可能处于与当前不同的起源上。简单地说,这些命令就像是 reset 快照更改的按钮。 这些命令就像一个"重置"按钮来进行快照更改。

    现在按照安装指南。

    Docker 擦除和清除

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    现在按照安装指南。

    如果你在运行子空间网络的节点或农民时遇到一些问题,请随时加入我们的 Discord,或者更好的是,你可以查看我们的论坛并查看现有问题,或者在需要时发布新问题!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/common_problems/index.html b/zh/docs/farming-&-staking/farming/common_problems/index.html index 11bc0f24578..cde5dfcdd0c 100644 --- a/zh/docs/farming-&-staking/farming/common_problems/index.html +++ b/zh/docs/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html b/zh/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html index 359788a4632..289ea010d1a 100644 --- a/zh/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/zh/docs/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 虽然此内存在必要时可以轻松释放,但由于系统中的某些细微差别,Windows 偶尔可能无法准确显示内存分配。 内存过高的问题可以忽略

    ::警告 Windows 无输出错误

    如果你遇到节点不输出任何内容并且没有给出错误代码的错误,则你可能只需要安装最新的 Visual C++ 可再发行组件包here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. 这将提示你设置你的 Pulsar 配置以开始耕作。你应该会看到类似的提示,如下所示(有些信息可能与此处显示的信息不同,与你的操作系统有关): You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    危险

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/zh/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index 3e522ade350..ddd50c6be44 100644 --- a/zh/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/zh/docs/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    版本:最近

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    加密 钱包

    Before running anything you need to have a wallet where you'll receive testnet coins. 目前我们建议使用两种钱包,SubWallet 是首选途径。

    将上述两个钱包之一安装到你的浏览器中,并在其中创建一个新帐户。最后一步需要你的帐户地址 您的帐户地址在最后一步是必要的

    如需帮助,请参阅我们的论坛帖子如何设置 Subwallet 和 Polkadot.js 钱包

    • 请务必遵循上面帖子底部的奖励部分。

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/zh/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 586f50dc100..a5e2cd3ef8c 100644 --- a/zh/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/zh/docs/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    如果你想了解有关 TMUX 及其选项的更多信息,请查看他们的回购协议[here](https://github.com/tmux/tmux/wiki)

    :::

    * 使用名为 Farming 的套接字文件创建新的 TMUX 会话

    ```shell-session
    $ tmux -S farming
    ```

    * 通过分离将进程移至后台

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * 重新连接

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * 删除耕作会话

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/zh/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index cf0e50cf55f..32706eefb22 100644 --- a/zh/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/zh/docs/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    偶尔在更新到新版本的 Pulsar 后,你将需要擦除你的节点和农民,通常这不是必需的,但如果你的农民在以前工作正常后出现问题,则可以尝试。

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. 您需要启用 RUST_BACKTRACE 环境变量。

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/index.html b/zh/docs/farming-&-staking/index.html index 8c4edb7d5ab..212f57f3453 100644 --- a/zh/docs/farming-&-staking/index.html +++ b/zh/docs/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/staking/index.html b/zh/docs/farming-&-staking/staking/index.html index d12cddaeeeb..49a1680d044 100644 --- a/zh/docs/farming-&-staking/staking/index.html +++ b/zh/docs/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/staking/intro/index.html b/zh/docs/farming-&-staking/staking/intro/index.html index b05bb289372..fd7c035a4cf 100644 --- a/zh/docs/farming-&-staking/staking/intro/index.html +++ b/zh/docs/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/staking/operators/index.html b/zh/docs/farming-&-staking/staking/operators/index.html index 0024efb77f8..91e1f472584 100644 --- a/zh/docs/farming-&-staking/staking/operators/index.html +++ b/zh/docs/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/timekeeping/index.html b/zh/docs/farming-&-staking/timekeeping/index.html index ce8c153e5a7..d31747e744d 100644 --- a/zh/docs/farming-&-staking/timekeeping/index.html +++ b/zh/docs/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/wallets/polkadot/index.html b/zh/docs/farming-&-staking/wallets/polkadot/index.html index 149c82915bd..9ea7c86d059 100644 --- a/zh/docs/farming-&-staking/wallets/polkadot/index.html +++ b/zh/docs/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    危险

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. 然后单击“使用生成的种子添加帐户”

      step-6

    3. 恭喜你已创建 polkadot.JS 钱包!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/zh/docs/farming-&-staking/wallets/subwallet/index.html b/zh/docs/farming-&-staking/wallets/subwallet/index.html index d87d22e893d..f40e48253f1 100644 --- a/zh/docs/farming-&-staking/wallets/subwallet/index.html +++ b/zh/docs/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/zh/docs/learn/intro/index.html b/zh/docs/learn/intro/index.html index d11a9425f51..975c47af5bc 100644 --- a/zh/docs/learn/intro/index.html +++ b/zh/docs/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/zh/docs/learn/security/index.html b/zh/docs/learn/security/index.html index f1fb820f654..e6850c19903 100644 --- a/zh/docs/learn/security/index.html +++ b/zh/docs/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules:

    your existing rules
    ...
    sudo ufw allow 30333 comment 'The node port '
    sudo ufw allow 30433 comment 'DSN port'
    sudo ufw allow 30533 comment 'Farmer port'

    allowing both TCP and UDP protocols.

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/zh/docs/learn/subnomicon/index.html b/zh/docs/learn/subnomicon/index.html index 8386546b93b..0d35d0d43ae 100644 --- a/zh/docs/learn/subnomicon/index.html +++ b/zh/docs/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/zh/docs/participate/CODE_OF_CONDUCT/index.html b/zh/docs/participate/CODE_OF_CONDUCT/index.html index 20d2febd24f..fa86811dfa9 100644 --- a/zh/docs/participate/CODE_OF_CONDUCT/index.html +++ b/zh/docs/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -42,7 +42,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/zh/docs/participate/contribute/index.html b/zh/docs/participate/contribute/index.html index 887bd1ab073..781cfeb0b4f 100644 --- a/zh/docs/participate/contribute/index.html +++ b/zh/docs/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • 试着从第三人称的角度来考虑你的代码,这对任何在你使用的技术方面有类似背景的人来说都是有意义的。
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    社区

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/zh/docs/participate/index.html b/zh/docs/participate/index.html index bd453eb90f3..ce9e49f408f 100644 --- a/zh/docs/participate/index.html +++ b/zh/docs/participate/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Awesome Subspace

    警告

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    将 POC 共识带到基底

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/zh/docs/participate/translate/index.html b/zh/docs/participate/translate/index.html index 6485e49b1e4..b759ab3c068 100644 --- a/zh/docs/participate/translate/index.html +++ b/zh/docs/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    版本:最近

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. SPOT 输入英语文本的语言翻译
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/additional-guides/index.html b/zh/docs/pre-release/category/additional-guides/index.html index 1d092dba9dc..9f93c296a2f 100644 --- a/zh/docs/pre-release/category/additional-guides/index.html +++ b/zh/docs/pre-release/category/additional-guides/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/advanced-cli/index.html b/zh/docs/pre-release/category/advanced-cli/index.html index 8c6982ea553..d1269f9b977 100644 --- a/zh/docs/pre-release/category/advanced-cli/index.html +++ b/zh/docs/pre-release/category/advanced-cli/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/develop-on-nova-evm-/index.html b/zh/docs/pre-release/category/develop-on-nova-evm-/index.html index 56c23856c94..8295d804825 100644 --- a/zh/docs/pre-release/category/develop-on-nova-evm-/index.html +++ b/zh/docs/pre-release/category/develop-on-nova-evm-/index.html @@ -7,13 +7,13 @@ - +
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/develop/index.html b/zh/docs/pre-release/category/develop/index.html index d0c2145842f..4d126c07be0 100644 --- a/zh/docs/pre-release/category/develop/index.html +++ b/zh/docs/pre-release/category/develop/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/farming/index.html b/zh/docs/pre-release/category/farming/index.html index 10044c3ba25..4929cb69f4c 100644 --- a/zh/docs/pre-release/category/farming/index.html +++ b/zh/docs/pre-release/category/farming/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/learn/index.html b/zh/docs/pre-release/category/learn/index.html index 96a44f4f6d7..11da320fe22 100644 --- a/zh/docs/pre-release/category/learn/index.html +++ b/zh/docs/pre-release/category/learn/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/operators-and-nominators/index.html b/zh/docs/pre-release/category/operators-and-nominators/index.html index 369bff04753..826532fa75f 100644 --- a/zh/docs/pre-release/category/operators-and-nominators/index.html +++ b/zh/docs/pre-release/category/operators-and-nominators/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/participate/index.html b/zh/docs/pre-release/category/participate/index.html index ba999c19865..10c60f89d5c 100644 --- a/zh/docs/pre-release/category/participate/index.html +++ b/zh/docs/pre-release/category/participate/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/pulsar-recommended/index.html b/zh/docs/pre-release/category/pulsar-recommended/index.html index 8e96b272411..2517fe621c4 100644 --- a/zh/docs/pre-release/category/pulsar-recommended/index.html +++ b/zh/docs/pre-release/category/pulsar-recommended/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/category/wallets/index.html b/zh/docs/pre-release/category/wallets/index.html index aec4ef97199..8993ade4485 100644 --- a/zh/docs/pre-release/category/wallets/index.html +++ b/zh/docs/pre-release/category/wallets/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/block_explorer/index.html b/zh/docs/pre-release/develop/nova/block_explorer/index.html index 63be99912e9..8c3a3c6546e 100644 --- a/zh/docs/pre-release/develop/nova/block_explorer/index.html +++ b/zh/docs/pre-release/develop/nova/block_explorer/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/faucet/index.html b/zh/docs/pre-release/develop/nova/faucet/index.html index 6f9d8270287..4a5cbc6fa95 100644 --- a/zh/docs/pre-release/develop/nova/faucet/index.html +++ b/zh/docs/pre-release/develop/nova/faucet/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Discord-2

  • As soon as you get a Developer role, the Faucet channel will become available to you.

  • You can use a slash command /faucet your_EVM_wallet_address_here to request tokens. Faucet-1

  • In case of a successful request, you will see the confirmation and link to the blockscout explorer shortly. Faucet-2

  • You can request tokens once every 24 hours.

  • - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/foundry_guide/index.html b/zh/docs/pre-release/develop/nova/foundry_guide/index.html index f6b7ef30942..32a66304a57 100644 --- a/zh/docs/pre-release/develop/nova/foundry_guide/index.html +++ b/zh/docs/pre-release/develop/nova/foundry_guide/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Let’s have a look at the Counter.sol smart contract and add a few more functions to the standard behavior. Our smart contract will have three functions: setNumber() that sets the uint256 number to the provided value, increment() which increases the value by 1 and decrement() which decreases the value by 1.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }
  • Let’s make sure that all functions are working properly by adding a couple of tests to the Counter.t.sol test file and check if they pass.

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.13;

    import "forge-std/Test.sol";
    import "../src/Counter.sol";

    contract CounterTest is Test {
    Counter public counter;

    function setUp() public {
    counter = new Counter();
    counter.setNumber(2);
    }

    function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 3);
    }

    function testSetNumber(uint256 x) public {
    counter.setNumber(x);
    assertEq(counter.number(), x);
    }

    function testDecrement() public {
    counter.decrement();
    assertEq(counter.number(), 1);
    }
    }
  • In our tests, we first set the initial value of number to two, then check if function increment() increases the value by 1 and if decrement() decreases the value by 1. Let’s build a project by running:

    forge build

    and ensure that tests are working as expected by running

    forge test

    Foundry-2

    Nice, all tests are passing, meaning the smart contract is working as expected.

  • Next, there are two things we need to set, in order to deploy our smart contract:

    • We need to connect a wallet that has sufficient balance of TSSC to cover the gas fees.
    • We need to set an environment variable we will use later.

    In order to make our lives easier, let’s create a new Makefile as well as .env file at the root of our project. .env files are typically used to store environment variables for your application. They are particularly useful for managing settings that change between deployment environments (e.g., development, testing, staging, and production), and for storing sensitive information.

    Environment variables can include database connection details, API keys, external resource URIs, or other configuration variables that might change depending on the environment in which the application is running. In our case, we would use it to point to our Core-EVM RPC url by setting

    RPC_URL=https://domain-3.evm.gemini-3g.subspace.network/ws

    And then set a private key for the EVM-compatible wallet

    PRIVATE_KEY=”your_private_key_value”
    tip

    It's important to note that .env files should not be committed to your source control (like Git), especially when they contain sensitive data, like your private key. To prevent this, add .env to your .gitignore file. This helps to keep sensitive keys secure and avoids the risk of exposing them in the application's code or version control history.

    In the Makefile, let’s create shortcuts to the main features of the application

    # include .env file and export its env vars
    -include .env

    # Builds
    build:
    @forge clean && forge build --optimize --optimizer-runs 1000000

    # Deployment
    deploy:
    @forge create Counter --private-key ${PRIVATE_KEY} --rpc-url ${RPC_URL}

    We're importing the values for a PRIVATE_KEY and RPC_URL from the .env file.

    This allows us to run make build for building the project and make deploy for deploying the project pointing to the provided RPC and using the provided private_key.

    Let’s run

    make build

    to make sure it’s working properly.

    Foundry-3

  • In order to deploy your contract using the specified RPC and PRIVATE_KEY just run

    make deploy
  • Congratulations, you've successfully deployed your smart contract on Subspace EVM!

  • - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/general-information/index.html b/zh/docs/pre-release/develop/nova/general-information/index.html index 900de3f8882..e9feba8a615 100644 --- a/zh/docs/pre-release/develop/nova/general-information/index.html +++ b/zh/docs/pre-release/develop/nova/general-information/index.html @@ -7,14 +7,14 @@ - +
    版本:预发布

    General information on dev tools and Subspace EVM

    What tools are available for developers?


    Developing smart contracts involves a suite of tools that aid in writing, testing and deploying code on the blockchain. Subspace utilizes an instance of the Ethereum Virtual Machine. Therefore, every tool used to build, test, and deploy smart contracts on Ethereum is also available for Subspace!

    First, Solidity is the primary programming language for writing smart contracts. It is statically typed, supports inheritance, libraries, and complex user-defined types, making it familiar for developers with a background in other statically typed languages such as C++, Java, or JavaScript.

    Integrated Development Environments (IDEs) such as the Remix IDE are often used to aid in writing smart contracts. Remix IDE is a browser-based IDE that enables you to write, deploy, and interact with Solidity smart contracts. It features a built-in static analysis tool that checks your code for common errors.

    For local development and testing, you have multiple options. You can spin up your own version of a Subspace Developer Node and farmer to deploy contracts, develop applications, and run tests. Alternatively, you can use Ethereum development tools like Hardhat or Anvil, which are fully compatible with Subspace due to their EVM compatibility.

    For deploying and interacting with smart contracts, a JavaScript provider like the one injected by the MetaMask browser extension is used. This provider enables JavaScript applications to communicate with the Subspace network or any Ethereum-compatible network. It's compatible with both ethers.js, web3.js and Web3.py, allowing developers to use either library for their blockchain operations.

    All these tools together provide an ecosystem for EVM-compatible smart contract development, making the process more manageable and efficient.

    Smart Contract


    A smart contract is a digital agreement coded into a blockchain network, designed to automatically execute or enforce the terms of a contract. These self-executing contracts, primarily developed on decentralized computer systems, eliminate the need for an intermediary by conducting transactions directly between parties. Smart contracts are transparent, traceable, and irreversible, providing immediate certainty about outcomes once preset conditions are met. They streamline various applications, from finance to supply chain management, by automating workflows and facilitating trustless interactions.

    Differences with Ethereum


    Subspace Token (TSSC) is the sole method of payment for gas within the Subspace EVM runtime. There will be a bridge to convert farmed tokens into EVM-compatible tokens to cover the gas fees, however, at the moment the only viable option to get some TSSC on your wallet is through the Subspace faucet

    What is Solidity?


    Solidity is a statically typed, contract-oriented, high-level language primarily used for implementing smart contracts on blockchain platforms like Ethereum. Its syntax is similar to that of JavaScript and C++, which makes it relatively easy for developers from those language backgrounds to pick it up. Its features such as contract classes, inheritance, complex user-defined types, and libraries bring object-oriented programming capabilities to blockchain development.

    One of the key features of Solidity is its first-class support for "contracts." These are akin to classes in object-oriented languages but are deployed on the Ethereum blockchain, allowing them to maintain a persistent state over time and interact with other contracts, the same way as objects interact in traditional programming.

    Moreover, Solidity comes with safety features, such as a robust type system and control structures, which help prevent bugs. It also provides a variety of built-in functions for performing operations like cryptographic hashing, signature verification, and address checking, making it easier to write secure code.

    The popularity of Solidity is primarily due to its design for Ethereum, the leading smart contract platform. As Ethereum gained traction for decentralized applications (dApps), Solidity became the go-to language for writing smart contracts for these applications. Furthermore, its resemblance to widely-used languages like JavaScript and C++ helped its adoption amongst developers.

    Lastly, Solidity is continually evolving with frequent updates, new features, and improvements that address the unique needs of blockchain development. This responsive development and the thriving community around it further solidify its position as the leading language for smart contract development.

    Solidity has a great community of developers and extensive documentation is available on the official website.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/hardhat_guide/index.html b/zh/docs/pre-release/develop/nova/hardhat_guide/index.html index ae964b1e7d5..e11e74279e9 100644 --- a/zh/docs/pre-release/develop/nova/hardhat_guide/index.html +++ b/zh/docs/pre-release/develop/nova/hardhat_guide/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Make sure you have NodeJS version >=16.0 installed.

    1. Open a new terminal and run these commands to create a new folder for the project.
    mkdir subspace-hardhat
    cd subspace-hardhat
    1. Then initialize an npm project as shown below. You'll be prompted to answer some questions.
    npm install --save-dev hardhat
    npm install --save-dev @openzeppelin/contracts
    npx hardhat

    Select "Create a JavaScript Project" from the list of the available options. Select project root folder and select to create a .gitignore file (optional).

    Hardhat-1

    1. Right after you create your workspace, you will notice several folders. All of your contracts will reside inside the contracts folder, deployment scripts are available inside the scripts folder, and tests can be found inside the test folder. Click on the contracts folder and open Lock.sol.

    Hardhat-3

    1. When in Lock.sol, you can change the name of your contract (in the example, to Counter), the name of the token (in this example, we're calling it SubspaceTestToken) and the token symbol (we're using TSSCtest).

    Let’s add a simple smart contract that has three functions - setNumber(), increment() and decrement().

    // SPDX-License-Identifier: UNLICENSED
    pragma solidity ^0.8.9;

    import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

    contract Counter is ERC20 {
    constructor() ERC20("SubspaceTestToken", "TSSCtest") {}

    uint256 public number;

    function setNumber(uint256 newNumber) public {
    number = newNumber;
    }

    function increment() public {
    number++;
    }

    function decrement() public {
    number--;
    }
    }

    Let's also rename the filename to Counter.sol for consistency.

    1. Deploying a smart contract can be an expensive procedure due to the gas costs associated with the transaction. Hence, it’s advisable to thoroughly test the smart contracts for correctness before proceeding with deployment. To test the contract, open the tests folder and examine the Lock.js file created for us. Replace the internals of the file with the following code:
    const { expect } = require("chai");

    describe("Counter", function() {
    let Counter;
    let counter;
    let owner;
    let addr1;

    beforeEach(async function() {
    Counter = await ethers.getContractFactory("Counter");
    [owner, addr1] = await ethers.getSigners();

    counter = await Counter.deploy();
    });

    describe("Counter operations", function() {
    it("Should return initial value of zero", async function() {
    expect(await counter.number()).to.equal(0);
    });

    it("Should set number to a new value", async function() {
    await counter.setNumber(5);
    expect(await counter.number()).to.equal(5);
    });

    it("Should increment the number", async function() {
    await counter.setNumber(5);
    await counter.increment();
    expect(await counter.number()).to.equal(6);
    });

    it("Should decrement the number", async function() {
    await counter.setNumber(5);
    await counter.decrement();
    expect(await counter.number()).to.equal(4);
    });
    });
    });

    For consistency, let's also rename Lock.js to CounterTest.js

    1. To run the test, simply type npx hardhat test

    Hardhat-4

    Great, looks like everything is working as expected. We’re all set for the deployment!

    1. In order to deploy the contract, we need to set a deployment network for hardhat. Open hardhat.config.js file and add the subspace to the list of networks.
    require("@nomicfoundation/hardhat-toolbox");
    module.exports = {
    solidity: "0.8.19",
    networks: {
    subspace: {
    url: "https://domain-3.evm.gemini-3g.subspace.network/ws",
    accounts: ["private_key_to_your_account"]
    }
    }
    };
    tip

    Be careful to not commit hardhat.config.js file as it contain your private key. You can use NPM tools like dotenv to securely store your private keys in the .env file.

    1. Open to deploy.js file and replace the content with the code.

    Hardhat-5

    const hre = require("hardhat");

    async function main() {
    const Contract = await hre.ethers.getContractFactory("Counter");
    const contract = await Contract.deploy();

    console.log("Contract deployed to:", contract.target);
    }

    main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
    });
    1. You're all set to deploy your smart contract on Subspace Network! In order to deploy, run npx hardhat run scripts/deploy.js --network subspace.

    This command will deploy your smart contract on the network we've just specified in hardhat.config.js file.

    In case of success deployment, you should see Contract deployed to: transaction hash.

    Hardhat-6

    1. Congratulations, you've successfully deployed your smart contract on the Subspace EVM domain!
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/intro/index.html b/zh/docs/pre-release/develop/nova/intro/index.html index 0e81abd4987..8755c962646 100644 --- a/zh/docs/pre-release/develop/nova/intro/index.html +++ b/zh/docs/pre-release/develop/nova/intro/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Developer Guide


    Subspace is a secure, scalable, decentralized blockchain that resolves the blockchain trilemma without making compromises. This guide will cover some of the main aspects of Subspace, if you’re willing to learn more about the technology behind Subspace it’s better to refer to the Whitepaper - Full-Length or Whitepaper - Summarized

    What makes the Subspace Network protocol different?


    Some new blockchain protocols, designed to be more efficient, fair, and decentralized, are using a system called Proof-of-Capacity (PoC) that prioritizes storage-intensive farming over compute-intensive mining. However, this poses a challenge known as the farmer's dilemma, where users must decide whether to allocate their limited storage to maintain the blockchain's state and history, or to use it for consensus. This may lead to a centralization of farming among a few trusted operators. Subspace, a novel Proof-of-Archival-Storage (PoAS) blockchain, resolves this issue by allowing farmers to store the blockchain's history collectively, separating the processes of consensus and computation. This results in reduced overheads and facilitates participation by regular users, even in complex execution models.

    Decoupled execution keeps farming lightweight and resistant to pooling, while the farmer storage network enables the blockchain to scale massively without becoming centralized.

    Intro-1

    What is a Proof-of-Archival-Storage?


    At Subspace, we implement a Proof-of-Archival-Storage protocol based on the following:

    • A Nakamoto (or longest-chain) consensus protocol
    • Employing a proof-of-capacity resource puzzle for space-bound Sybil resistance
    • The space reflects some useful storage (as in Proof-of-Replication)
    • And the specific data being replicated is the archival history of the Subspace chain

    In its simplest form, our Proof-of-Archival-Storage consensus is a 3-phase protocol:

    • Archiving phase: given new blocks of the chain, construct canonical history.
    • Plotting phase: given the canonical history of the blockchain, generate a unique replica (the plot) and store it on disk.
    • Consensus phase: given a challenge from a secure randomness beacon, audit the plot for a solution that satisfies some threshold, return a proof, and propose a block.

    If you’re curious to read more about our consensus, here is a great overview written by one of our researchers, Dariia Porechna.

    A few words about Subspace's consensus protocol Dilithium


    As we transition to our Dilithium v2 consensus, we've recognized the essential role polynomial schemes will play in the next era of blockchain design, just as hash functions, Merkle trees, and ECC signatures did in the previous decade. Subspace is distinctively equipped to utilize these schemes effectively due to our proof-of-archival-storage (PoAS) consensus, which enables a self-regulating feedback loop for storage costs, helping us scale with demand. This enables us to leverage polynomial schemes for linear blockspace scaling proportional to the number of network participants. We specifically employ Reed-Solomon erasure coding and Kate-Zaverucha-Goldberg (KZG) commitments in our v2 consensus, allowing efficient data recovery and authentication.

    When archiving the history of Subspace, we replace Merkle roots with KZG commitments. Farmers can then provide constant-sized Kate proofs to clients of the Distributed Storage Network (DSN) as the witness for their pledged archival storage space. We construct generic proofs-of-replication (PoR) from RS-KZG schemes and extend these into an extremely simple and efficient proof-of-archival-storage (PoAS).

    Is it difficult to build applications on Subspace Network?


    Our primary objective is to maintain a minimum barrier to entry for both our farmers and developers. The installation of a Subspace Network node can be accomplished in less than 15 minutes and is compatible with an extensive array of computer systems given the highly accessible minimum requirements for the hardware.

    When it comes to development on the Subspace Network, we offer a range of flexible options. At present, you can make use of our multiple Ethereum Virtual Machine (EVM) domains for a familiar experience. Soon, we will also provide the functionality for you to build your own local custom virtual machine if that's your preference. We take pride in the unlimited possibilities we provide - there are no boundaries!

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/local_development/index.html b/zh/docs/pre-release/develop/nova/local_development/index.html index 2f4ac1389b4..6c0ca341a0d 100644 --- a/zh/docs/pre-release/develop/nova/local_development/index.html +++ b/zh/docs/pre-release/develop/nova/local_development/index.html @@ -7,14 +7,14 @@ - +
    版本:预发布

    Local development

    Setting up a local development environment

    You can always set up a local network to test and deploy your smart contract!

    To establish a full local network, you need to run a local node, a Core-EVM domain, and a farmer.

    First, visit the Subspace releases page and download the most up-to-date stable versions of the node and farmer.

    tip

    For each release, there are two versions:

    1. skylake: for newer processors from around 2015 and onwards
    2. x86-64-v2: for older processors from around 2009 and some older VMs

    Older processors/VMs are no longer supported by official releases, but they can still be compiled manually if desired.

    After downloading both files that suit your system, start a node using your preferred terminal. If you want to start an EVM domain on your local machine, you need to specify:

    • Your local RPC server port
    • Your local web-socket RPC port You can do this with the following command:
    ./your_subspace_node_path --dev --alice --rpc-port 9444 -- --domain-id 3 --dev --rpc-port 8545

    This will create a local RPC on port 8545.

    Secondly, you need to start a farmer by running the following command:

     ./your_subspace_farmer_path farm --reward-address [YOUR REWARD ADDRESS] path=tmp-farm,size=100M

    You can specify the desired plot size, but 100M should be sufficient.

    And that’s it! By starting your local node and a farmer, you have your local RPC ready for testing and deploying your smart contracts! You can easily connect your MetaMask account to the local development network, as well as use Remix or Foundry in order to test and deploy smart contracts on a local network!

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/quick_start/index.html b/zh/docs/pre-release/develop/nova/quick_start/index.html index fcbd3766a57..e613c2c42c3 100644 --- a/zh/docs/pre-release/develop/nova/quick_start/index.html +++ b/zh/docs/pre-release/develop/nova/quick_start/index.html @@ -7,14 +7,14 @@ - +
    版本:预发布

    Quick start

    The only tools needed to get you started


    The Quick Start is designed with the presumption that you are not a novice developer and have some basic understanding or experience. The Quick Start also anticipates that you seek a straightforward initiation into setting up a remote development environment.

    Subspace utilizes EVM (Ethereum Virtual Machine) so any tool available for Ethereum development is compatible with Subspace.

    Setup a MetaMask Wallet (or any other EVM-compatible wallet) and connect it to our custom EVM


    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    Get tokens to your wallet using our faucet


    Follow the instructions here to use our Faucet to get some TSSC.

    Test and deploy your smart contract


    You can use Remix, Foundry or any other tool familiar to you for testing and deploying your smart contracts. Just make sure to use our custom EVM domain and you're all set.

    If anything above sounds unfamiliar, you can always fall back to our full guide.

    Have any questions? Feel free to post them on our forum or in our Developer-chat on Discord.


    In order to get access to the role-gated developer chat:

    1. Join our Discord

    2. Click on Subspace Network at the top left corner and choose Linked Roles.

      Discord-1

    3. Link your GitHub account to get a developer role and gain access to developer-chat. Discord-2

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/remix_guide/index.html b/zh/docs/pre-release/develop/nova/remix_guide/index.html index 90f460b2df2..78e74bf70f8 100644 --- a/zh/docs/pre-release/develop/nova/remix_guide/index.html +++ b/zh/docs/pre-release/develop/nova/remix_guide/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ Remix allows you to use one of the existing EVMs or inject your own provider through its integration with MetaMask. Since we already have a MetaMask Account set up, let’s use this option.

    Remix-10

    1. You will be prompted to confirm the password with MetaMask, just make sure that the network you’re connected to is Subspace EVM.

    Remix-11

    1. Adjust the gas limit and deploy your smart contract on Subspace Core EVM. Now your transaction is recorded and you can interact with your smart contract at the bottom of the page - it's possible to call the functions increment() and decrement() as well as setNumber()

    Remix-12

    Congratulations, you've just deployed your smart contract on Subspace Core EVM!

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/develop/nova/setting-up-metamask/index.html b/zh/docs/pre-release/develop/nova/setting-up-metamask/index.html index 3307f1f3fec..015bac37475 100644 --- a/zh/docs/pre-release/develop/nova/setting-up-metamask/index.html +++ b/zh/docs/pre-release/develop/nova/setting-up-metamask/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ Select your preferred language in the top-right corner. Read and agree to MetaMask's terms of use.

    MetaMask-1

    1. Click on “Create a new wallet”. Read a note on gathering usage data and either agree to collect your anonymized data, or skip this step. It does not affect the creation of a wallet.

    MetaMask-2

    1. On the next screen you will be asked to create a password. Remember to always set a secure password that’s difficult to guess. Type your password twice before proceeding to the next step.

    MetaMask-3

    1. MetaMask automatically assesses the strength of your password.
      tip

      As a rule of thumb, you should set a strong password, meaning that it includes uppercase letters, lowercase letters, numbers and special characters.

    MetaMask-4

    1. Watch a video to learn more about your Secret Recovery Phrase before proceeding to the next step.

    MetaMask-5

    1. Have a look and write down your 12-word recovery phrase.
      info

      The wallet with the recovery phrase for this guide will be deleted right after the guide is complete.

    MetaMask-6

    1. Confirm that you’ve written down the recovery phrase by filling in the missing words of your recovery phrase.

    MetaMask-7

    1. Now that your wallet is created, let’s connect to the Subspace Core EVM. Click on the Ethereum Mainnet logo and select Add Network.

    MetaMask-8

    1. At the settings, click on “Add a network manually”

    MetaMask-9

    1. To connect to Subspace RPC specify the values below
    Network Name: Subspace EVM
    New RPC URL: https://domain-3.evm.gemini-3g.subspace.network/ws
    Chain ID: 1002
    Currency Symbol: TSSC

    You're all set, you have successfully configured your MetaMask wallet and connected it to Subspace Core EVM. To deploy your smart contract, you first need to get a small amount of TSSC tokens into your wallet. Please make sure to refer to the faucet section of the guide to learn more about getting test tokens.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html b/zh/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html index 3a8fa0114ae..c44d5777596 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/additional-guides/port-forwarding/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 1. 1.这将在顶部显示你的家庭路由器的 IP 地址
  • The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address
  • We will then type hostname -I | awk '{print $1}' which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.
  • Find router IP Address on Windows

    1. Open up PowerShell and type ipconfig
      1. This will display the IP Address of your home router as Default Gateway:
    2. This command will also display your computer's internal IP address named as IPv4 Address typically something like 192.168.0.25 ensure to record this IP address as well.

    Find router IP Address on OSX

    1. Open up a terminal and type netstat -nr|grep default
      1. This will display the IP Address of your home router
    2. The top of the terminal will show the IP address typically 192.168.0.1 we will want to record this IP Address 3. We will then type ipconfig getifaddr en1 for wireless, or ipconfig getifaddr en0 for ethernet. which will return your computer's internal IP address typically something like 192.168.0.25 ensure to record this IP address as well.

    Step 2. Connecting to your router


    Now we will input the router IP Address into an Internet browser (Firefox, Chrome, Edge, etc), this will take you to some kind of login page. At this point we will need to find the default admin login information. There are typically 3 ways to locate this information.

    1. It will usually be physically located on the router, in the detailed information area where you may find a barcode, or serial number.

      • It may also be in the user manual of the router as well
    2. Sometimes it may also be given to you on an information card from your Internet technician when you first setup your internet.

    3. 某些 ISP 将其配置为你的 ISP 门户帐户登录信息。

    4. You may also attempt to google the default information, provided you have the serial number and model. Below is a website which may help in looking this information up. (Often times it's set to some generic default like Admin & Password as the credentials.

      All Default Router IP Address, Username and Passwords List | Find it Here!

    Step 3. Forwarding your ports


    The actual forwarding process will vary based on your router, below is the general process and crucial information you will need along the way.

    1. Login to your router at the login page we located in the prior steps.
    2. Advanced Settings > Port Forwarding
    3. Within the port forwarding screen we will see the following fields, all fields have been filled accordingly to our defaults, except for the Computer IP Address, you will replace this with the computer IP address you received in the first steps.
      1. Computer IP Address: 192.168.0.25
      2. Protocols: TCP, UDP
      3. Starting Port: 30333
      4. Ending Port: 30333
      • Note, that if you change from the default 30333 port on your node configuration you will need to forward the respective port used.
    4. Once you have entered the needed information click save/apply. (Note: You may have to reboot your router/router depending on the model.)
    5. You can then verify if your port has been forwarded via the following website.
      1. https://www.whatismyip.com/port-scanner/ The testing website can give false negatives, try running the farmer/node as well to test.
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html index 8d8b50fc496..3dcd39cdd4b 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-install/index.html @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ And if you installed under a regular user, you will need to switch to that user beforehand.

    Now you can start the services:

    sudo systemctl start subspace-{node,farmer}
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html index f701c2c4067..9546b954007 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    版本:预发布

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    加密 钱包

    Before running anything you need to have a wallet where you'll receive testnet coins. 目前我们建议使用两种钱包,SubWallet 是首选途径。

    将上述两个钱包之一安装到你的浏览器中,并在其中创建一个新帐户。最后一步需要你的帐户地址 您的帐户地址在最后一步是必要的

    如需帮助,请参阅我们的论坛帖子如何设置 Subwallet 和 Polkadot.js 钱包

    • 请务必遵循上面帖子底部的奖励部分。

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html index 9aabc40c65e..3824dbd2fa9 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-tips/index.html @@ -7,14 +7,14 @@ - +
    版本:预发布

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    使用自定义路径

    如果你想使用外部硬盘驱动器,你可以为你的 Node\&Farmer 设置一个自定义路径,或者从默认设置一个自定义路径。 如果您喜欢,您可以将节点和农场主设置为不同的目录。

    #### 设置节点自定义路径。
    要将节点设置为使用自定义路径,只需添加 `--base-path` 参数。

    ```bash
    # start node and store data in `NODE_DATA_PATH` instead of default location
    ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g ...`
    ```

    从子空间的旧/不同版本切换到新快照

    info

    除非开发团队特别提到,否则您不应该不必在新版本上擦除和清除您的配置。

    通常,你应该能够下载最新版本,并使用与以前版本相同的命令重新启动 Node\&Farmer,而不会出现任何错误。

    在某些情况下,版本更新会导致你的节点和农民出现问题,你可能必须擦除和清除你的节点,通常是在发生错误时, 如果您有任何问题,您总是可以在我们的 Forums和连接到我们的 Discord 服务器寻求帮助。

    帮助

    你可以在 Farmer 或 Node 上使用额外的命令和参数,在 --help 任何其他命令之后使用以显示其他选项。

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME farm --help

    Timekeepers

    Gemini-3g introduces Proof-of-Time and a new, optional role has been added to the node. Timekeepers help run PoT to ensure the security of the network. Timekeeping requires a high-performance core CPU but can be undertaken by any node runner. You can enable timekeeping with the following commands.

    • --timekeeper: To enable timekeeping on the node
    • --timekeeper-cpu-cores: To specify which cores the Timekeeper will run on.

    Read more about Timekeepers

    Node & Farmer Commands Guide

    Both the node and the farmer have a variety of flags and parameters. To see a full list, append the --help flag to either the node or the farmer command.

    Common Command Examples

    Farming Changes

    Please note that as of Gemini-3g farming no longer occurs while plotting. This is to ensure the plotting process occurs in the most efficient manner. You can change this by adding the --farm-during-initial-plotting flag to the farmer.

    For both the node and the farmer, here are some frequently used commands:

    • Display farm information: ./FARMER_FILE_NAME info PATH_TO_FARM
    • Scrub the farm for errors: ./FARMER_FILE_NAME scrub PATH_TO_FARM
    • Erase all farmer-related data: ./FARMER_FILE_NAME wipe PATH_TO_FARM
    • Start the node with a custom data path: ./NODE_FILE_NAME --base-path NODE_DATA_PATH --chain gemini-3g
    • Erase all node-related data: ./NODE_FILE_NAME purge-chain --base-path NODE_DATA_PATH --chain gemini-3g

    Utilizing Multiple Disks

    To maximize storage capabilities, you can engage multiple disks directly. This is often more efficient than relying on RAID configurations:

    示例:

    ./FARMER_FILE_NAME farm --reward-address WALLET_ADDRESS \
    path=/media/ssd1,size=100GiB \
    path=/media/ssd2,size=10T \
    path=/media/ssd3,size=10T

    Optimizing DSN Syncing

    Parameters to Use with Caution
    --out-peers
    --in-peers
    --in-peers-light
    --dsn-target-connections
    --dsn-pending-in-connections
    --dsn-in-connections

    The default parameters are set with the capabilities of common consumer modem/routers in mind. Adjusting certain parameters could enhance DSN sync performance by increasing parallelism. However, if you decide to increase them significantly, ensure that your modem/router is performant enough to handle the increased traffic.

    Node:

    --dsn-out-connections
    --dsn-pending-out-connections

    Farmer: Increasing the values of the farmer parameters could increase the plotting speed.

    --out-connections
    --pending-out-connections
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html index f2abc697ace..67aa5326ef5 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/advanced-cli/cli-troubleshooting/index.html @@ -7,14 +7,14 @@ - +
    版本:预发布

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    擦除和清除

    如果你之前正在运行节点,并希望切换到新的快照,请执行以下步骤,然后再次遵循指导原则:

    # Replace `FARMER_FILE_NAME` with the name of the node file you downloaded from releases
    ./FARMER_FILE_NAME wipe PATH_TO_FARM
    # Replace `NODE_FILE_NAME` with the name of the node file you downloaded from releases
    ./NODE_FILE_NAME purge-chain --chain gemini-3g

    无论 Node/Farmer 可执行文件是以前的还是来自新的快照,两者都可以工作:) 我们需要这样做的原因是,每次快照更改时,网络可能会被分区,并且你可能处于与当前不同的起源上。简单地说,这些命令就像是 reset 快照更改的按钮。 这些命令就像一个"重置"按钮来进行快照更改。

    现在按照安装指南。

    Docker 擦除和清除

    In case of Docker setup run docker compose down -v (and manually delete custom directories if you have specified them).

    现在按照安装指南。

    如果你在运行子空间网络的节点或农民时遇到一些问题,请随时加入我们的 Discord,或者更好的是,你可以查看我们的论坛并查看现有问题,或者在需要时发布新问题!

    * Forums

    * Discord

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, you might encounter an error message indicating the need for a Rust backtrace to diagnose issues:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This message suggests that Rust, the programming language used in Subspace Network Farmer & Node, has encountered a problem. By default, the backtrace is not displayed. To enable the RUST_BACKTRACE environment variable and view detailed error information, use the following commands based on your operating system:

    • 🖼️ Windows (PowerShell): Enter $Env:RUST_BACKTRACE=1 in PowerShell and rerun the application.
    • 🍎 macOS: Type export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • 🐧 Ubuntu: Enter export RUST_BACKTRACE=1 in the terminal and rerun the application.
    • ⚙ Service (Linux): For services, use sudo systemctl edit subspace-node or sudo systemctl edit subspace-farmer, add [Service] and Environment=RUST_BACKTRACE=1 between the warning comments, reload with sudo systemctl daemon-reload, and restart services using sudo systemctl restart subspace-{node,farmer}.

    By enabling RUST_BACKTRACE, you can obtain additional diagnostic information to help resolve any errors encountered during operation.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/common_problems/index.html b/zh/docs/pre-release/farming-&-staking/farming/common_problems/index.html index dbd13cb8560..dbf5e98dbfa 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/common_problems/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/common_problems/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Common problems

    While Subspace strives to release bug-free software, users may encounter certain errors. Some of these can be safely ignored, while others require attention.

    Common problems and ways to resolve them

    Error while dialing dns telemetry

    Error while dialing /dns/telemetry.subspace.network/tcp/443/x-parity-wss/%2Fsubmit%2F
    Custom { kind: Other, error: Timeout }

    This error is related only to the telemetry server. It's something that can happen occasionally, but doesn't affect farming. You can safely ignore it.

    Farmer stuck on plotting, no progress is made in several hours

    Try restarting your node or farmer. We've noticed that sometimes, when creating larger plots, the process might appear to be stalled, but it automatically continues after some time.

    Illegal instruction (core dumped)

    This error is caused by old CPUs without necessary instruction support (e.g. ADX 4). Can be fixed by compiling software from the source on that machine.

    While processors without ADX instructions are supported, their performance will be impacted significantly compared to processors that do support ADX instructions.

    Most modern desktop processors starting with Broadwell on the Intel side and Ryzen (ZEN 1) on the AMD side do support necessary ADX instructions support and shouldn't be affected by the error.

    No rewards after multiple days of farming

    Please make sure to:

    note

    Make sure to select the correct testnet in the dropdown and tabs, e.g. gemini-3g

    Recovering missing piece failed

    ERROR single_disk_plot{disk_farm_index=0}:
    subspace_farmer_components::segment_reconstruction: Recovering missing piece failed. missing_piece_index=135

    This is not a crucial error and it can be ignored.

    Importing block consensus error

    Error importing block "block_number", consensus error: Import failed: Database

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Unable to author block in slot. No best block header

    Unable to author block in slot. No best block header: Chain lookup failed: Failed to get header for hash

    Your PC likely ran out of space. Consider freeing up some space by removing unnecessary files, and then try again. Alternatively, you may adjust the plot amount to match the available disk space

    Fast node synchronization (more than 100+ blocks per second) goes only up to ±20k blocks, then synchronization speed drops significantly.

    As the database size increases and blocks get bigger (as farmers started to produce votes), it is expected that the sync speed will settle on a smaller number. We have made some performance improvements in Gemini 3e and will do more performance tuning when the protocol is functionally complete.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN.

    subspace_farmer::single_disk_plot::piece_receiver: Couldn't get a piece from DSN. Retrying... piece_index=57

    This isn’t a bug but rather a warning, it is something to be expected on a Decentralized Storage Network. There is nothing you need to do as a user with this warning, it's likely it will come up occasionally but as long as there aren’t other more catastrophic errors it can be ignored.

    Failed to build a farmer: File exists

    0: Failed to build a farmer
    1: Single disk plot creation error: I/O error: File exists (os error 17)
    2: I/O error: File exists (os error 17)
    3: File exists (os error 17)

    The system is detecting a pre-existing installation. If this is the case, you might consider wiping the current setup and re-initializing the CLI to ensure a clean installation.

    Block import error: Potential long-range attack: block not in finalized chain.

    WARN sc_service::client::client: Block import error: Potential long-range attack: block not in finalized chain.

    The node somehow ended up being on a fork, try wiping and starting from scratch.

    Still Facing Trouble? Take a look at our forums below

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html index 8c99c4f0a5b..c92cd3f7d96 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-install/index.html @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ 虽然此内存在必要时可以轻松释放,但由于系统中的某些细微差别,Windows 偶尔可能无法准确显示内存分配。 内存过高的问题可以忽略

    ::警告 Windows 无输出错误

    如果你遇到节点不输出任何内容并且没有给出错误代码的错误,则你可能只需要安装最新的 Visual C++ 可再发行组件包here

    Step 1: Download the Pulsar Executable


    Step 2: Initialize Pulsar


    We will now initialize Pulsar. This is where we will configure Reward Address, Plot Size, Plot Location, etc.

    1. Open Powershell, type cd Downloads (or cd Your-File-Location).
    2. Execute the init command as seen below.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe init
    1. 这将提示你设置你的 Pulsar 配置以开始耕作。你应该会看到类似的提示,如下所示(有些信息可能与此处显示的信息不同,与你的操作系统有关): You should see a similar prompt like so:
    Configuration creation process has started...
    Do you have an existing farmer/reward address? [y/n]: y
    Enter your farmer/reward address: REDACTED_ADDRESS
    Enter your node name to be identified on the network (defaults to `username`, press enter to use the default):
    Specify a path for storing plot files (press enter to use the default: `"/home/username/.local/share/pulsar/farms"`):
    Specify a path for storing node files (press enter to use the default: `"/home/username/.local/share/pulsar/node"`):
    Specify a plot size (defaults to `2.0 GB`, press enter to use the default):
    Specify the chain to farm. Available options are: [Gemini3f, Dev, DevNet].
    Defaults to `Gemini3f`, press enter to use the default:
    Configuration has been generated at /home/username/.config/pulsar
    Ready for lift off! Run the follow command to begin: `"path/to/executable" farm`
    1. Once complete, the settings will be written to the settings.toml. You can find Your settings.toml in $FOLDERID_RoamingAppData/pulsar/settings.toml

    Step 3. Start Farming with Pulsar


    危险

    A Windows Defender Firewall has blocked some features of this app warning may appear. This is because the application is trying to access the internet. This is expected as it is how the farmer talks to other farmers on the network, select Allow access to continue farming.

    We will now start the farmer with the farm command

    1. Run the following command below to start farming with Pulsar.
    ./pulsar-windows-x86_64-skylake-v0.7.0-alpha.exe farm
    1. You should see the farmer and node start successfully and begin syncing, plotting, and then farming:
    Starting node ... (this might take up to couple of minutes)
    Node started successfully!
    Starting farmer ...
    Farmer started successfully!
    Initial plotting for plot: #0 (/home/username/.local/share/pulsar/farms)
    ⠁ [00:00:00] 3% [=> ]
    (31.00 MiB/953.67 MiB) 157.35 GiB/s, plotting, ETA: 0s
    1. That's it! Enjoy and Happy Farming!
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html index b4a50e45fac..3c418694706 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-prerequisites/index.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
    版本:预发布

    Prerequisites

    System Requirements

    Farming can be Network Intensive.

    Make sure you have a stable network connection. During the plotting phase of farming, it can be network intensive.

    This may impact your network usage so please check your network connection if you have a hard data limit.

    HardwareSpecs
    CPU4 Core+
    RAM8GB+
    SWAP4GB
    Storage100GB SSD

    Security Considerations

    For a secure farming setup, ensure your system is updated, use a secure wallet, configure firewalls properly, and follow network safety protocols. Detailed security practices are available on our Security Best Practices page.

    加密 钱包

    Before running anything you need to have a wallet where you'll receive testnet coins. 目前我们建议使用两种钱包,SubWallet 是首选途径。

    将上述两个钱包之一安装到你的浏览器中,并在其中创建一个新帐户。最后一步需要你的帐户地址 您的帐户地址在最后一步是必要的

    如需帮助,请参阅我们的论坛帖子如何设置 Subwallet 和 Polkadot.js 钱包

    • 请务必遵循上面帖子底部的奖励部分。

    Required ports

    Currently, a few ports need to be exposed for node to work properly.

    If you have a server with no firewall, there is nothing to be done, but otherwise make sure to open the following TCP and UDP ports for incoming connections.

    • 30333
    • 30433
    • 30533

    On the desktop side if you have a router in front of your computer, you'll need to forward TCP and UDP ports to the machine on which your node is running (how this is done varies from router to router, but there is always a feature like this, refer to How to Forward Ports for a more in-depth tutorial). If you're connected directly without any router, then again nothing needs to be done in such case.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html index 7e0c8aac0fc..fc8b60c958d 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-tips/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Tips & Tricks

    Additional Tips

    Welcome to the Additional Tips section! Whether you're a seasoned farmer or just starting out with the Subspace Network, these tips and tricks are designed to enhance your experience and efficiency. Here, we delve into practical advice and lesser-known techniques to help you fine-tune your farming setup and navigate common challenges with ease. From configuring your environment to managing background processes, these insights are tailored to ensure your Farmer operates smoothly and effectively. Let's dive in and explore how you can get the most out of your Subspace Network Farmer.

    Telemetry & Block Explorer

    Explore the Subspace Network in depth with our variety of telemetry tools and block explorers. Whether you're monitoring network activity or exploring blockchain data, these resources provide comprehensive insights into the network's performance and transactions.

    • Telemetry Server: Get real-time insights into network activity and performance metrics. Ideal for monitoring the overall health and status of the Subspace Network.

    • Official Block Explorer: Our primary tool for viewing blocks, transactions, and network activity on the Subspace Network. This explorer offers an intuitive interface and detailed information.

    • Subscan Block Explorer: An alternative block explorer providing detailed views of blocks, transactions, and network events. Subscan is known for its user-friendly interface and additional data analytics features.

    • Polkadot.js Block Explorer: For users familiar with the Polkadot ecosystem, this explorer offers a seamless experience for exploring the Subspace Network using the Polkadot.js interface.

    Specify Version

    The settings.toml file contains critical configurations for Pulsar, including the network your node connects to. Specify your network environment by setting the chain variable under the [node] section:

    # settings.toml
    [node]
    chain = 'gemini-3g' //In this Example we have set to Gemini-3g
    # ... additional configuration settings ...

    Set the chain value to your target network identifier.

    • Local Development: Set to dev
    • Gemini Testnet: Set to gemini-3g

    Moving the Farming Process to the Background

    :::tip Learn More about Tmux
    如果你想了解有关 TMUX 及其选项的更多信息,请查看他们的回购协议[here](https://github.com/tmux/tmux/wiki)

    :::

    * 使用名为 Farming 的套接字文件创建新的 TMUX 会话

    ```shell-session
    $ tmux -S farming
    ```

    * 通过分离将进程移至后台

    ```text
    Ctrl+b d OR ⌘+b d (Mac)
    ```

    * 重新连接

    ```shell-session
    $ tmux -S farming attach
    ```

    * Alternatively, you can use the following single command to both create (if not exists already) and attach to a session:

    ```shell-session
    $ tmux new-session -A -D -s farming
    ```

    * 删除耕作会话

    ```shell-session
    $ tmux kill-session -t farming
    ```
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html index 22e3b621abf..eddbe32f103 100644 --- a/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html +++ b/zh/docs/pre-release/farming-&-staking/farming/pulsar/pulsar-troubleshooting/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Troubleshooting

    Troubleshooting

    If you are facing issues with your node/farmer you can try a few of the following things below, if you are unable to get your issue resolved please check our Forums to see if your issue may have been solved, if its a new one feel free to post it! You can also join our Discord for additional Peer to Peer help.

    info

    We have included a few tutorials below that may help you in your support journey, this is not an all inclusive list but we welcome contributions

    Wipe Node & Farmer

    Updated from a previous version and now having issues?

    偶尔在更新到新版本的 Pulsar 后,你将需要擦除你的节点和农民,通常这不是必需的,但如果你的农民在以前工作正常后出现问题,则可以尝试。

    To simply restart the node, go to the terminal where you started the farm command, and press Ctrl + C you should see a shutdown message appear and the application will attempt a simple shutdown, if you dont see the message press Ctrl + C again to force shutdown. You can then simply start the farmer again with the farm command you used prior.

    Use the same file name as the previous init and farm steps, then add the wipe command to free the previous storage that was being used. Generally, only do this if you have severe errors and are prompted by a staff member.

    ./pulsar-file-name wipe

    After wiping, follow the init and farm steps above to start farming again!

    View your Logs

    A good place to start if you are facing trouble is by viewing your logs and seeing if there are any errors or insights that might be available. You can find the location for your logs below:

    • 🖼️ Windows: %USERPROFILE%/AppData/Local/pulsar/logs
    • 🍎 macOS: $HOME/Library/Logs/pulsar/
    • 🐧 Ubuntu: $HOME/.local/share/pulsar/logs

    Enable Rust Backtrace

    When running the Subspace Network Farmer & Node, sometimes you may encounter an error message that includes a line similar to the following:

    Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

    This error message means that Rust (the programming language that Subspace Network Farmer & Node is written in) has encountered a problem and has provided a diagnostic backtrace that can help diagnose the issue. However, by default, the backtrace is not displayed. 您需要启用 RUST_BACKTRACE 环境变量。

    To enable the RUST_BACKTRACE enter the following into your terminal:

    • 🖼️ Windows(PowerShell): $Env:RUST_BACKTRACE=1
    • 🍎 macOS: export RUST_BACKTRACE=1
    • 🐧 Ubuntu: export RUST_BACKTRACE=1

    Once you have enabled the RUST_BACKTRACE simply rerun the application and you will get additional info upon any errors.

    Common Problems

    Looking for solutions to other common issues?

    Check out our Common Problems page. This resource covers a range of frequently encountered challenges, offering practical solutions to help you overcome them. Please note that while this page addresses many common issues, it is not an all-inclusive list. For issues not covered, you can visit our forums or Discord for additional support.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/index.html b/zh/docs/pre-release/farming-&-staking/index.html index c6bc75afa5a..e5e2f6938b8 100644 --- a/zh/docs/pre-release/farming-&-staking/index.html +++ b/zh/docs/pre-release/farming-&-staking/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/staking/index.html b/zh/docs/pre-release/farming-&-staking/staking/index.html index 620d818b806..3a9ab5d26ae 100644 --- a/zh/docs/pre-release/farming-&-staking/staking/index.html +++ b/zh/docs/pre-release/farming-&-staking/staking/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ Staking-25
  • On the same screen, choose domainStakingSummary(u32).
  • Provide the domainId.
  • Run the query, remember the currentTotalStake number. Staking-26
  • Without leaving the page, select operators(u64).
  • Provide operatorId that you nominated previously.
  • Run the query, remember the currentTotalStake number. Staking-27
  • To calculate your nominator balance:

    1. Calculate share price by dividing currentTotalStake from the domain by operator currentTotalStake.
    2. Multiply share price and your nominator shares number.
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/staking/intro/index.html b/zh/docs/pre-release/farming-&-staking/staking/intro/index.html index ec36e7dd506..acd88842d11 100644 --- a/zh/docs/pre-release/farming-&-staking/staking/intro/index.html +++ b/zh/docs/pre-release/farming-&-staking/staking/intro/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Introduction to Staking and Operators

    Operators are a key part in solving the farmer's dilemma

    Subspace introduces the Decoupled Execution Framework (DecEx) to tackle the state-bloat issue by separating transaction ordering from execution. Farmers confirm and order transactions, while staked operator nodes execute them, allowing different hardware requirements for each role. This keeps farming accessible and lays the groundwork for scalable execution. Users submit transactions to operators who batch them into bundles. Farmers verify and order them, with operators executing the transactions in this order. The process forms a deterministic receipt chain, with an initial implementation using an optimistic fraud-proof validation scheme.

    Key differences between farming and being an operator

    Farming

    • Consensus: This is the primary role of Farmers, and provides security and consensus for the network. Our Farmers are what ensure we don't trust, but verify.
    • Transaction Ordering: Farmers are responsible for confirming the availability of transactions and providing an ordering.
    • Lightweight Requirements: The hardware requirements for farming are designed to be lightweight, making it accessible to anyone.
    • Verification: Farmers only verify the proof-of-election and ensure that the data is available.
    • Transactions: Farmers do not execute transactions; they focus on ordering them and including them in the blockchain.

    Being an operator

    • Transaction Submission and Execution: Operators are responsible for batching transactions into bundles and submitting them to the consensus chain, executing transactions included in the consensus block and maintaining the resulting chain state.
    • Higher Hardware Requirements: Operators require more substantial hardware capabilities, as they must execute complex transactions.
    • Require Initial Investment: Operators are required to stake a certain amount of SSC. If an operator acts maliciously, their stake is at risk of being slashed. Engaging in such malicious behavior carries significant penalties, providing crypto-economic security to execution.
    • Pre-Validation and Batching: Operators pre-validate and batch transactions into bundles through a stake-weighted election process.
    • Deterministic Execution: The operators execute transactions in a specific, deterministic order, producing state commitments in the form of execution receipts.
    • Secondary Network Role: Monitors the Domain chain for malicious activity and submits fraud proofs to consensus chain.
    • Supports Various Environments: Can support different smart contract execution environments like the Ethereum Virtual Machine (EVM) or Web-Assembly (WASM).

    Operator hardware requirements

    note

    The hardware requirements have not been benchmarked, and these are our best estimates. We would appreciate your feedback if you feel that the requirements listed here are too high or too low.

    tip

    Our suggested specs are not necessarily applicable to Stake Wars. We encourage all interested participants to join Stake Wars, even if your hardware does not meet the listed requirements.

    CPU:

    • x86-64 compatible;
    • Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);
    • 4 physical cores @ 3.4GHz;
    • Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);
    • Prefer single-threaded performance over higher cores count. A comparison of single-threaded performance can be found here.

    Storage:

    • An NVMe SSD of 1 TB. In general, the latency is more important than the throughput.

    Memory:

    • 32 GB DDR4 ECC.

    System:

    • Linux Kernel 5.16 or newer.

    Network:

    • The minimum symmetric networking speed is set to 500 Mbit/s.

    Staking

    The Subspace Network relies on staking from both domain operators and farmers to secure the network and provide resources. Subspace implements a Nominated Proof-of-Stake algorithm where token holders endorse operators who execute transactions and produce blocks.

    Our staking model consists of two tiers:

    • Farmers earn rewards proportional to their pledged storage. Farmers can choose to nominate operators and back them with their own stake, increasing their chance of being elected as a slot leader. Farmers, who have earned storage rewards, nominate operators to execute transactions. This nomination system balances the power between farmers who nominate and operators and both parties share the rewards and the potential penalties (slashing).

    • Operators stake to gain the right to produce bundles within a domain. They are responsible for validating and executing transactions, producing execution receipts, and applying state transitions and earn rewards for their work. The operator's chances to be elected as a slot leader and produce a bundle are weighted by their stake. Operators can be nominated by farmers or other SSC holders.

    Stake epoch

    Stake epoch is a designated period in domain blocks within a blockchain system that marks each stake allocation re-adjustment period. Occurring every StakeEpochDuration blocks (at the moment, it's set to every 100 blocks or ~10 minutes), an epoch transition triggers specific actions such as finalizing operator domain switches, deregistering operators, unlocking operators and their associated funds, and recalculating stake distribution for the Verifiable Random Function (VRF) election. These transitions are designed to adjust the stake distribution dynamically, finalize various staking-related operations, process rewards, and manage deposits and withdrawals. The uniform duration across all domains helps maintain consistency in the network, while the specific starting point for each domain's epoch transition may vary based on when it is registered, helping to amortize the load of these transitions.

    note

    Read Subspace Subnomicon to get a full picture behind decoupled execution!

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/staking/operators/index.html b/zh/docs/pre-release/farming-&-staking/staking/operators/index.html index 71cab26e50b..b0b689568fd 100644 --- a/zh/docs/pre-release/farming-&-staking/staking/operators/index.html +++ b/zh/docs/pre-release/farming-&-staking/staking/operators/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ ./target/release/subspace-node --chain dev -- --domain-id 0 --keystore-path tmp/keystore --rpc-cors all
    tip

    You can use any chain to generate a keypair, we recommend using a dev chain for simplicity. You can adjust the --keystore-path if you prefer to generate the keys in a different location.\

    1. Start a local polkadot interface portal by running a docker contrainer.

    docker run --rm -it --name polkadot-ui -e WS_URL=ws://0.0.0.0:9945 -p 80:80 jacogr/polkadot-js-apps:latest

    1. Proceed to the browswer and type localhost in the search bar. You should be taken to the polkadot portal.

    RPC-2

    1. Navigate to developer -> rpc calls

    2. Select author in call the selected endpoint and pick a rotateKeys() in the dropdown.

    RPC-3

    1. Press on Submit RPC call.

    2. You will see a newly generated key on the screen. The key will also be written in a keystore location you specified earlier.

    tip

    You will use this key in order to register an operator later.

    The domain operator node is running with an embedded consensus node, thus you need to specify the args for both the consensus node and the domain operator node:

    subspace-node [consensus-chain-args] -- [domain-args]

    Example: Start a node as operator on gemini-3g chain:

    info

    You need to wipe (purge-chain) and sync your node from genesis block, since you need to sync both consensus and domain chains. -You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 +You do not need to wipe any existing plots.

    note

    Ensure you replace your_domain_id with your domain identifier in the command and your_operator_id with your operator_id. If your keystore is located in a different folder, adjust the --keystore-path accordingly. Setting --base-path is optional.

    tip

    You can ignore setting up your_operator_id while you're syncing your node. Make sure to set it after syncing and registration.

    tip

    Stake Wars are using the domain Nova with ID 1.

    target/production/subspace-node `
    --chain gemini-3g `
    --name your_node_name `
    --base-path your_path_to_node_data `
    -- `
    --domain-id your_domain_id `
    --chain gemini-3g `
    --operator-id your_operator_id`
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp `
    --keystore-path /keystore

    You should see the node start successfully and begin syncing.

    Staking-13

    To view the stored node information navigate to:

    FOLDERID\_LocalAppData e.g.
    `C:\Users\Alice\AppData\Local`

    Register an operator on domain

    info

    It's crucial to fully sync your node before registering as an operator. Please follow the commands in the Start the domain operator node section and only register as an operator once your node is fully synced. If many operators are registered but their nodes are still syncing or offline, it can adversely affect the speed of block production in the domain.

    Prefer a video? Expand for our installation video using PolkadotJS interface.
    1. Proceed to the Subspace Staking portal and connect your wallet.

    NStaking-1

    1. Select the wallet you would like to connect. Both Subwallet and PolkadotJS wallets are supported.

    NStaking-2

    1. Enter your password to give an access to your wallet.

    NStaking-3

    1. Select the account you'd like to use form the dropdown menu. You will see both available and locked (staked) token balances for each account.

    NStaking-4 5. Proceed to the Stake as a pool operator tab.

    NStaking-5 6. Select the domainId you would like to be registered on. Enter the Minimum Operator Stake, Amount to Stake, Nomination Tax and Signing key and then click Next.

    NStaking-6

    info

    Make sure to use the signing key generated on the previous Create operator key step.

    1. Approve the request in the pop-up window.

    NStaking-8 8. Congratulations, you're now registered as an operator!

    NStaking-8

    info

    It can take up to 10 minutes for the operator to be registered and appear on the page. @@ -34,7 +34,7 @@ You can create a key using the following command:

    target/production/subspace-node key generate --scheme sr25519

    Staking-4

    Back up the key. Take the public key (hex) of the Keypair. The public key is part of the operator config we will be using later on Staking portal or PolkadotJS portal.

    Insert key to Keystore:

    The key generated above needs to be added to the Keystore so that the operator node can use it to participate in bundle production.

    To insert the key, use the following command:

    target/production/subspace-node key insert \
    --suri "<Secret phrase>" --key-type oper --scheme sr25519 --keystore-path /keystore

    The command above assumes /keystore as the keystore location. suri is the secret phrase of the operator key.

    tip

    tmp folder on linux based systems will be emptied upon the system reboot. Make sure to store the keypair in a secure and permanent location.\

    Switch domains

    Any Operator can switch domain they operate on anytime. In order to switch domain:

    1. Proceed to PolkadotJS
    2. Make sure to select the correct network at the top-left corner.
    3. Select the account you want to use in using the selected account.
    4. Select domains under submit the following extrinsic and choose switchDomain(operatorId, newDomainId) in the dropdown.
    5. Add your operatorId and newDomainId to the corresponding fields.

    Staking-24

    note

    Only the account who registered Operator can swith the domain.

    note

    Stake of your Nominators won't be released, but will be moved to the new domain as well.

    Useful commands

    Running both validator (farmer) and operator nodes at the same time

    tip

    To run both operator and validator at the same time, provide requrired flags for both roles when starting your node.

    target/production/subspace-node `
    --chain gemini-3g `
    --blocks-pruning 256 `
    --state-pruning archive `
    --no-private-ipv4 `
    --validator `
    --name your_node_name `
    -- `
    --domain-id your_domain_id `
    --operator-id your_operator_id`
    --keystore-path /keystore `
    --bootnodes /ip4/3.87.28.170/tcp/40333/p2p/12D3KooWGHtULvhdKMZtzigSK1438uWXPj9rBQHVzTaKMWv1WRXp

    You should see the node start successfully and begin syncing.

    Staking-28

    Switching to another server

    To ensure the minimum downtown during your switch, we propose the following:

    1. Sync a new operator node using a throwaway key. You can generate a new key, just not insert it into your keystore.
    2. Stop the original node and rename the keystore (or whatever you feel comfortable doing to prevent you accidentally starting the original node up with the original signing key).
    3. Update the keystore on the new node with the original signing key.
    4. Restart the new operator node.
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/timekeeping/index.html b/zh/docs/pre-release/farming-&-staking/timekeeping/index.html index f6e98b969a9..2b92a1d540d 100644 --- a/zh/docs/pre-release/farming-&-staking/timekeeping/index.html +++ b/zh/docs/pre-release/farming-&-staking/timekeeping/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Timekeeping

    Timekeeping is an essential component of securing the protocol. Without at least one timekeeper online there would be no block production. While it is possible to run a farmer or operator node with timekeeping activated, the ideal is that a high-spec, dedicated machine is used to mitigate processing loads altering the quality of the work they do.

    Having a good number of timekeepers distributed geographically is our goal to foster a healthy network. Our hope is that our dedicated community run a number in addition to those being run by the team to ensure resilience and decentralization of the protocol.

    note

    There is no explicit economic incentive to running a timekeeper, however, independent timekeeping contributes to stable block production, which benefits every participant of the network.

    You can read more about timekeeping in the Proof-of-Time section of The Subnomicon.

    Hardware Requirements

    Being a timekeeper has high hardware requirements to ensure that a user with a stronger machine is not able to consistently beat every other timekeeper on the network. All timekeepers are in a race with each other to generate their proofs and we need a grid of equally provisioned F1 cars rather than a mix of classes with varying power.

    Note that these specs are our starting point and are subject to change as we discover the exact characteristics required to be a good timekeeper.

    HardwareSpecs
    CPU4 core+ with as high a frequency as possible. An overclocked Intel 14900k is the ideal. Note that only 1 core will be occupied with timekeeping.
    RAM8GB+
    Storage100GB SSD

    Command Line Parameters

    There are two new CLI options on the node visible with --help:

    • --timekeeper - to become a timekeeper.
    • --timekeeper-cpu-cores - to specify which cores timekeeper should use rather than random cores.
    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/wallets/polkadot/index.html b/zh/docs/pre-release/farming-&-staking/wallets/polkadot/index.html index 7adad0dc98e..ce96189677b 100644 --- a/zh/docs/pre-release/farming-&-staking/wallets/polkadot/index.html +++ b/zh/docs/pre-release/farming-&-staking/wallets/polkadot/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Polkadot.js

    note

    Polkadot.js is a Substrate/EVM wallet created by the creators of Substrate & Polkadota/Kusama the Parity Team.

    This is the barebones wallet. This is because it is the barebones Substrate wallet that supports all Substrate based networks. This is an extension that works similarly to MetaMask, or most other browser based wallets you’ve likely used in the past.

    Create A New Wallet

    1. Visit the Polkadot.js Website and Download your respective version.
    tip

    The Chrome option will work on all Chromium based browsers such as Brave, Vivaldi, & Edge

    1. Once extension is installed, Open it. Read the notes.

      step-2

    2. Click on + to add a new account.

      step-3

    3. The extension will then show you your 12-word mnemonic seed.

    危险

    MAKE SURE YOU STORE THIS SECURELY, AND NEVER SHARE IT

    step-4

    1. Once you seed is securely stored and saved, click the “I have saved my mnemonic seed safely” check box and click “Next Step”

    2. The next step will ask for a Name & Password for the wallet. 然后单击“使用生成的种子添加帐户”

      step-6

    3. 恭喜你已创建 polkadot.JS 钱包!

      step-7

    Importing an Existing Seed

    Some users may be provided an existing mnemonic seed phrase that may have been provided by Subspace-Desktop, if this is the case you will want to follow this portion of the guide.

    1. Install the Extension (See step 1 of the previous section)

    2. Once extension is installed, Open it and click +, & Import account from pre-existing seed

      step-2a

    3. Type or Paste in your 12-Word mnemonic seed phrase & click Next

      step-3a

    4. The next step will ask for a Name & Password for the wallet. then click Add the account with the supplied seed

      step-4a

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official Polkadot.js Documentation. We have included some basic FAQ's below.

    How can I find my Public Address?

    • You can see your default substrate public address right below your Wallet name inside the extension

      trouble-1

    • You can see your Subspace Testnet public address via the ... menu and setting the Allow Use on Any Chain dropdown to Subspace Testnet, once you exit you will see the public address now starts with st

      trouble-2

      trouble-10

    I Dont see Subspace Testnet or any Subspace Networks as an option in chain settings

    • As seen below, sometimes when you first install or update the Substrate wallet you will need to update the wallet metadata.

      trouble-3

    1. Go to the Subspace/Polkadot Explorer here: Polkadot/Substrate Portal

    2. You will be prompted to allow the extension to connect, click Yes, allow this application access

      trouble-4

    3. On the Webpage, click settings

      trouble-5

    4. Click Metadata

      trouble-6

    5. Click Update Metadata

      trouble-7

    6. You will get a popup from the extension asking you to confirm click Yes, do this metadata update

      trouble-8

    7. You will now see Subspace Testnet as an option on the Allow use on any chain dropdown.

      trouble-9

    How do I backup my wallet?

    1. You can backup/export your wallet via the ... menu, then click Export Account

      trouble-11

    2. You will then enter your wallet password and click I want to export this account

      trouble-12

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/farming-&-staking/wallets/subwallet/index.html b/zh/docs/pre-release/farming-&-staking/wallets/subwallet/index.html index f687cc87812..dcdbd3bb6a3 100644 --- a/zh/docs/pre-release/farming-&-staking/wallets/subwallet/index.html +++ b/zh/docs/pre-release/farming-&-staking/wallets/subwallet/index.html @@ -7,7 +7,7 @@ - + @@ -21,7 +21,7 @@ rpc-step-3

  • This will open the Import Network menu, where you will see a few options

    • Provider URL
    • Network Name
    • Symbol
    • Block explorer
    • Crowdloan URL The only option that is required is the Provider URL. You can add an explorer if you would like but it is not required. The current Subspace Explorer is available here. You can refer to the RPC Endpoints above for available provider URLs for the Subspace Network.
    1. Fill in the provider URL, once you click out of this box it will check the URL and add the rest of the information, then click Save.
    • In this example we will be using wss://rpc-1.gemini-3g.subspace.network/ws

    rpc-step-4

    1. You will then be taken back to the network screen where you can then select your new network that was added.

    rpc-step-5

    Troubleshooting

    If you face any trouble or would like to learn about other features for SubWallet, please see the Official SubWallet Documentation..

    How do I backup my wallet?

    1. You can backup/export your wallet. Click on your Account.

      trouble-1

    2. Select the account you would like to backup and click on the edit sign.

      trouble-2

    3. Select Export.

      trouble-3

    4. You will then enter your wallet password and click which preferred export method you would like to use, either Seed phrase, JSON or QR code.

      trouble-4

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/learn/intro/index.html b/zh/docs/pre-release/learn/intro/index.html index 207c642819a..badb2da53a9 100644 --- a/zh/docs/pre-release/learn/intro/index.html +++ b/zh/docs/pre-release/learn/intro/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    👋Welcome

    The Subspace Network is an ambitious layer zero protocol which is the first scalable, secure, & decentralized infrastructure layer for the Web3 ecosystems.

    ❓ Learn About the Subspace Network


    🤝 Participate on the Network


    Our goal is to bring an extremely low barrier to entry for participating on consensus. You can get started as long as you meet the simple requirements mentioned below.

    - Start Farming with Pulsar

    📖 Develop on Subspace Network


    The Subspace Network aims to provide an amazing developer experience to anyone who wishes to build on top of the protocol. As such we have started working on a variety of tools to help with development within our network.

    - Core Protocol Development

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/learn/security/index.html b/zh/docs/pre-release/learn/security/index.html index 86ee2d582bb..41ee9c1d19b 100644 --- a/zh/docs/pre-release/learn/security/index.html +++ b/zh/docs/pre-release/learn/security/index.html @@ -7,7 +7,7 @@ - + @@ -39,7 +39,7 @@ LoginGraceTime 120

  • Restricting root login\ PermitRootLogin yes --> PermitRootLogin no

  • Specifying the Users allowed to connect through SSH\ AllowUsers user1 user2

  • Reload daemon for the changes to take effect:

    systemctl reload sshd
    • Reboot your system to ensure that everything is functioning as expected.

    Complete SSh manual: SSH Academy

    A Word About Partitioning as a Security Measure.

    As a security measure, it is worth mentioning the practice of allocating separate partitions for critical directories such as /boot, /var, /tmp, and /home (in some cases). This helps isolate system files, logs, temporary files, and user data, which can improve system stability and security. But the cons are there too:

    • if one partition runs out of space while another partition has unused space, it may not be possible to easily reallocate the disk space
    • monitoring and maintaining each partition separately, including backups, permissions
    • having a separate /tmp partition may result in increased disk I/O when temporary files are created and deleted
    • if the /home partition is separate, migrating to a new server or upgrading the operating system may require additional steps to ensure the proper migration of user data and configurations
    • having separate partitions can increase the risk of data loss if one partition fails or becomes corrupted

    The partitioning recommendations for farming in Subspace will be covered in the "Partitioning and mounting file system" section of the left tab menu.

    Upgrading ...

    Upgrading packages

    While Linux distributions regularly release security patches to address known vulnerabilities in software packages, it doesn't always make sense to install every available update on a server. Unnecessary updates can introduce features or changes that might not be needed and, in some cases, may even cause system destabilization. If you've made customizations or modifications to your server's configuration or software, an upgrade could potentially overwrite or conflict with these changes.

    Therefore, it's essential to make upgrade decisions based on a thorough understanding of what each package does and reviewing their changelogs.

         To view the changelog for a particular package: `apt changelog <package_name>`

    Upgrading Kernel

    While kernel updates often come with bug fixes and security patches, there is a possibility that the new kernel version may introduce new bugs or compatibility issues. Not every kernel update is necessary or urgent. Some updates may provide incremental improvements or additional functionality that may not be essential for your specific use case. It's important to evaluate the benefits and potential risks before deciding to update the kernel.

    Upgrading the distribution version

    Pros:

    • Access to new features
    • Software compatibility
    • Security updates
    • Long-term support (LTS)

    Cons:

    • Potential for compatibility issues
    • Configuration changes
    • May have new bugs (which can be resolved by downgrading the bugged package).

    So everywhere ideally it is necessary to read changelogs, know what is needed and why, and comprehensively evaluate the need for upgrades. Although, of course, in most cases under ordinary (office) conditions everything should work.

    To Access Release Notes:

    Simply use the search function on the Ubuntu homepage.

    UFW

    According to the ordering of UFW rules (DENY rules should come first, followed by ALLOW rules), new 'ALLOW' rules can simply be added to the end of the existing rules.

    your existing rules
    ...
    sudo ufw allow from anywhere to any proto tcp port 30333 comment 'The node port '
    sudo ufw allow from anywhere to any proto tcp port 30433 comment 'DSN port'
    sudo ufw allow from anywhere to any proto tcp port 30533 comment 'Farmer port'

    Now with peace of mind you may go back to installing Node and Farmer.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/learn/subnomicon/index.html b/zh/docs/pre-release/learn/subnomicon/index.html index 667712aee96..2bf3fa9f30a 100644 --- a/zh/docs/pre-release/learn/subnomicon/index.html +++ b/zh/docs/pre-release/learn/subnomicon/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Discover the Subspace Protocol

    Unlock the capabilities of Subspace, a cutting-edge blockchain that perfectly balances scalability, security, and decentralization. With its innovative storage-based consensus mechanism and a commitment to core principles, Subspace stands as a beacon of a scalable and secure decentralized future.

    Embrace a New Era of Blockchain

    • Eco-Friendly: Redefining crypto mining with sustainability at its heart.
    • Resilient Decentralization: A network built to stand the test of time, without central points of failure.
    • Scalable Growth: Expanding capacity in tandem with our community, without compromising on security.
    • Interconnected Experience: Enabling seamless integration across the Web3 ecosystem.

    Your Journey Begins Here

    The Subnomicon is more than a guide; it's a deep dive into the philosophy, architecture, and community that make Subspace unique. Ready to be part of the revolution?

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/participate/CODE_OF_CONDUCT/index.html b/zh/docs/pre-release/participate/CODE_OF_CONDUCT/index.html index f29d48538bd..be8c9b9ce8b 100644 --- a/zh/docs/pre-release/participate/CODE_OF_CONDUCT/index.html +++ b/zh/docs/pre-release/participate/CODE_OF_CONDUCT/index.html @@ -7,7 +7,7 @@ - + @@ -42,7 +42,7 @@ Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/participate/contribute/index.html b/zh/docs/pre-release/participate/contribute/index.html index a4d0f71e5f9..3239e55662c 100644 --- a/zh/docs/pre-release/participate/contribute/index.html +++ b/zh/docs/pre-release/participate/contribute/index.html @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ Check out some of these amazing guides to help get you familiar with GitHub and contributing.

    Advanced Fix

    This section presumes a better understanding of GitHub, and programming basics.

    For larger, more advanced fixes please ensure you follow the basic principles below.

    • Do not comment simple trivial code such as importing existing components, and basic HTML/CSS.
    • Do comment on complex non-trivial code, complex logic should be easy to understand.
    • All public functions need to be commented.
    • If code is trivial but could be forgotten over time, please comment.
    • 试着从第三人称的角度来考虑你的代码,这对任何在你使用的技术方面有类似背景的人来说都是有意义的。
    • Sometimes difficult to understand code needs refactoring instead of more comments.
    • Make sure the program can still build prior to pull request.

    For advanced fixes you should follow the general pathway for GitHub.

    1. Create your own fork of the code. Fork
    2. Do the changes locally on your system in your preferred development environment.
    3. Following the README.md instructions, test your changes locally with yarn build and yarn run serve or npm build and npm run serve to ensure there are no clear issues.
    4. Push the changes to your fork and submit a pull request by comparing across forks. Submit Pull Request

    How to report a bug or error

    We do not have any strict template that you must follow, but please provide all required information so we can quickly resolve any issues.

    • If you find an actual programming bug, please submit a GitHub issue and use the label bug.
    • If you find a grammar/spelling/content error, please submit a GitHub issue and use the label documentation.

    How to suggest a feature or enhancement

    This documentation is for the community, so any feature requests are welcome.

    • If you are requesting a feature, please submit a GitHub issue and use the label enhancement.
    • Explain why this issue is needed, and what problems it will solve.
    • Indicate if you are able/willing to help implement this feature.

    Code review process

    • The core team will take a look at any pull requests as soon as possible, generally you can expect a response within a day or two.
    • If it is a simple and non-controversial fix we will review the code and approve.
    • If there are questions, feedback, or more discussion needs to be had we will reach out to the contributor on the Pull Request to try and resolve said issues.
    • If there is no response or activity within 2 weeks of team response we may close the pull request.

    社区

    You can chat with the core team on Discord https\://discord.gg/subspace-network.

    - + \ No newline at end of file diff --git a/zh/docs/pre-release/participate/index.html b/zh/docs/pre-release/participate/index.html index 11fc43b1b97..77fc0fb9e30 100644 --- a/zh/docs/pre-release/participate/index.html +++ b/zh/docs/pre-release/participate/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Awesome Subspace

    警告

    Please note, all community provided resources are non-official. For clarification please refer to official materials.

    Community Groups


    Telegram

    🇹🇷 - türk telegram topluluğu

    Reddit

    🇺🇸 - English Subreddit Community

    Discord

    🇨🇳 - 中国不和谐社区

    🇰🇷 - 한국 커뮤니티

    🇷🇺 - русское дискорд-сообщество

    🇺🇦 - українська діскорд-спільнота

    Community Translations


    Whitepaper

    Articles

    Information

    F.A.Q

    Getting Started Farming

    Medium

    Getting started guide

    将 POC 共识带到基底

    Subspace is the first protocol to completely resolve the blockchain trilemma without compromise. provided by solgas

    Events

    1st AMA

    Memes & Humor


    - + \ No newline at end of file diff --git a/zh/docs/pre-release/participate/translate/index.html b/zh/docs/pre-release/participate/translate/index.html index 4ec4c0058c5..fcaa31882c9 100644 --- a/zh/docs/pre-release/participate/translate/index.html +++ b/zh/docs/pre-release/participate/translate/index.html @@ -7,13 +7,13 @@ - +
    版本:预发布

    Translation Guide

    Translation Guide

    Welcome to the Subspace Network Docs translation guide! This guide is here to help you contribute to our goal of making the Subspace Network more accessible and inclusive by providing translations. The Subspace Network is driven by a vision of a decentralized and equitable future, and we believe that overcoming language barriers is crucial to achieving this vision.

    Mission and Vision

    The Subspace Network is inherently driven by the vision of a more equitable and decentralized future. We believe that to truly fulfill our vision, we need content that caters to the linguistic diversity of the global community. Thus, the Subspace Network Translation Initiative is born.

    Our mission

    1. Deliver translated versions of our content, empowering visitors worldwide to learn about Subspace Labs in their language.
    2. Expand the global Subspace community by onboarding members across language barriers.
    3. Facilitate accessible, inclusive sharing of Subspace Labs' information and knowledge.
    4. Encourage community members to contribute translations, impacting the ecosystem significantly.
    5. Identify, connect with, and mentor passionate contributors who want to be part of the ecosystem.

    Our vision

    1. Translate essential content for Subspace community members worldwide.
    2. Support knowledge sharing across languages to foster a well-informed and educated Subspace community.
    3. Enhance the inclusivity and accessibility of Subspace by demolishing language barriers.

    As Nakamoto envisioned a more equitable and decentralized future, Subspace Labs sees a future where language is no longer a barrier but a bridge uniting the global crypto community. We are crafting a universal Subspace where everyone has a voice, a place, and a language.

    Translation Leaderboard

    Translation How-To Guide

    This guide will walk you through how to provide translations for this documentation. By contributing, you help in realizing our mission and vision, ensuring the inclusivity and accessibility of our content to non-English speakers around the world.

    Prerequisites

    Guidelines

    • Our goal is to crowdsource a multi-language environment. If a translation already exists, please review it instead of adding a second one.
    • Ensure you follow our Contributing Standards, and our Code of Conduct.

    How-To

    Below you will find the walkthrough of how to provide translations for the Subspace Network through the Crowdin translation portal.

    1. Visit the respective translation portal for which website you would like to help translate (See above)

      translate-step-1

    2. Once you have logged in and joined the project you will be taken to the project Dashboard, Select which language you would like to translate. (See below)

      translate-step-2

    3. You will find yourself at a screen with all of the source files listed, select Translate All in the top right (See Below)

      translate-step-3

    4. You will then be brought into the Translation Portal, In this portal you will find the following

      1. English Version of the Text
      2. SPOT 输入英语文本的语言翻译
      3. Automated Suggestions for text
      4. Word List that needs translating
      5. A spot for comments if something needs clarification

      translate-step-4

    5. From here you will fill in your translations as you would like and finalize once you are done.

    6. Your translation will be reviewed and approved on a timely basis, please note translations can take a couple days before they populate on the deployed documentation.

    - + \ No newline at end of file diff --git a/zh/index.html b/zh/index.html index cb069de6daa..fe768089e93 100644 --- a/zh/index.html +++ b/zh/index.html @@ -7,13 +7,13 @@ - +

    从任何地方农场

    通过承诺额外的磁盘来运行农民节点以获得奖励。不需要昂贵的设置或预付资本。

    '轻量'

    在您的计算机后台运行农夫/种收者节点,并进行最低限度维护,不会影响您日常使用。

    '易于设置'

    设置应用只需要几分钟时间。它支持 Linux、Windows 和 macOS 操作系统。

    '常见奖励'

    用以下方式获得奖励:为让用户和创作者重新获得控制权的全球性分布式网络做贡献。

    - + \ No newline at end of file diff --git a/zh/markdown-page/index.html b/zh/markdown-page/index.html index 2312ac2e26d..239ac4a8cfd 100644 --- a/zh/markdown-page/index.html +++ b/zh/markdown-page/index.html @@ -7,13 +7,13 @@ - + - + \ No newline at end of file