diff --git a/404.html b/404.html index c73311d1cda2..911ecec92b39 100644 --- a/404.html +++ b/404.html @@ -19,13 +19,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/assets/js/493c7fdf.0549539a.js b/assets/js/493c7fdf.0549539a.js deleted file mode 100644 index 0a1b05a839fe..000000000000 --- a/assets/js/493c7fdf.0549539a.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2354],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),s=a(87152),r=a(34200),l=a(67425);function d(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,c,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(i),e.next=21,r.G.create({provider:d});case 21:c=e.sent,(h=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,c=(0,i.useState)(""),u=c[0],p=c[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(s.toString(),l,t,p):p(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,p);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,p):p(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},22703:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},d=void 0,c={unversionedId:"general/glossary",id:"general/glossary",title:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",source:"@site/../docs/general/glossary.md",sourceDirName:"general",slug:"/glossary",permalink:"/docs/glossary",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/glossary.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1694613787,formattedLastUpdatedAt:"Sep 13, 2023",frontMatter:{id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/faq"},next:{title:"Learn",permalink:"/docs/learn-index"}},h={},u=[{value:"Active Nomination",id:"active-nomination",level:2},{value:"Alexander",id:"alexander",level:2},{value:"Asset Hub",id:"asset-hub",level:2},{value:"Attestation",id:"attestation",level:2},{value:"Auction (Parachain)",id:"auction-parachain",level:2},{value:"Aura",id:"aura",level:2},{value:"Authority",id:"authority",level:2},{value:"Availability Cores",id:"availability-cores",level:2},{value:"BABE",id:"babe",level:2},{value:"Bitfield Array",id:"bitfield-array",level:2},{value:"Block",id:"block",level:2},{value:"Blockspace",id:"blockspace",level:2},{value:"Block Explorer",id:"block-explorer",level:2},{value:"Blocks Nominations",id:"blocks-nominations",level:2},{value:"BLS",id:"bls",level:2},{value:"Bonding",id:"bonding",level:2},{value:"Bounty",id:"bounty",level:2},{value:"Bridge",id:"bridge",level:2},{value:"Byzantine Fault Tolerance",id:"byzantine-fault-tolerance",level:2},{value:"Capacity",id:"capacity",level:2},{value:"Candidate",id:"candidate",level:2},{value:"Collations",id:"collations",level:2},{value:"Collator",id:"collator",level:2},{value:"Collectives",id:"collectives",level:2},{value:"Commission",id:"commission",level:2},{value:"Common Good (Parachain)",id:"common-good-parachain",level:2},{value:"Community Queue",id:"community-queue",level:2},{value:"Consensus",id:"consensus",level:2},{value:"Crowdloan",id:"crowdloan",level:2},{value:"Curator",id:"curator",level:2},{value:"Dapps",id:"dapps",level:2},{value:"DOT",id:"dot",level:2},{value:"Duty Roster",id:"duty-roster",level:2},{value:"Epoch",id:"epoch",level:2},{value:"Era",id:"era",level:2},{value:"Equivocation",id:"equivocation",level:2},{value:"External Queue",id:"external-queue",level:2},{value:"Extrinsic",id:"extrinsic",level:2},{value:"Fellowship",id:"fellowship",level:2},{value:"Finality",id:"finality",level:2},{value:"Finality Gadget",id:"finality-gadget",level:2},{value:"Frame",id:"frame",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Governance",id:"governance",level:2},{value:"Governance Council",id:"governance-council",level:2},{value:"GRANDPA Finality Gadget",id:"grandpa-finality-gadget",level:2},{value:"Hard Fork",id:"hard-fork",level:2},{value:"Hard Spoon",id:"hard-spoon",level:2},{value:"Horizontal Relay-routed Message Passing",id:"horizontal-relay-routed-message-passing",level:2},{value:"Inactive Nomination",id:"inactive-nomination",level:2},{value:"Inherent",id:"inherent",level:2},{value:"Injected Account",id:"injected-account",level:2},{value:"Interoperability",id:"interoperability",level:2},{value:"Keep-Alive Check",id:"keep-alive-check",level:2},{value:"KSM",id:"ksm",level:2},{value:"Kusama",id:"kusama",level:2},{value:"Lease Period",id:"lease-period",level:2},{value:"LIBP2P",id:"libp2p",level:2},{value:"Liveness",id:"liveness",level:2},{value:"Mainnet",id:"mainnet",level:2},{value:"Message",id:"message",level:2},{value:"Message Queue",id:"message-queue",level:2},{value:"Metadata",id:"metadata",level:2},{value:"Motion",id:"motion",level:2},{value:"Next Session",id:"next-session",level:2},{value:"Node Explorer",id:"node-explorer",level:2},{value:"Nominated Proof of Stake (NPoS)",id:"nominated-proof-of-stake-npos",level:2},{value:"Nominator",id:"nominator",level:2},{value:"Non-fungible Token (NFT)",id:"non-fungible-token-nft",level:2},{value:"On-chain Governance",id:"on-chain-governance",level:2},{value:"Online Message",id:"online-message",level:2},{value:"Polkadot OpenGov",id:"polkadot-opengov",level:2},{value:"Origin",id:"origin",level:2},{value:"Oversubscribed",id:"oversubscribed",level:2},{value:"Pallet",id:"pallet",level:2},{value:"Parachain",id:"parachain",level:2},{value:"Parachain Development Kit (PDK)",id:"parachain-development-kit-pdk",level:2},{value:"ParaID",id:"paraid",level:2},{value:"Parathread",id:"parathread",level:2},{value:"Parachain Registry",id:"parachain-registry",level:2},{value:"Parity Technologies",id:"parity-technologies",level:2},{value:"Polkadot",id:"polkadot",level:2},{value:"Polkadot Alliance",id:"polkadot-alliance",level:2},{value:"Host",id:"host",level:2},{value:"Runtime Environment",id:"runtime-environment",level:2},{value:"Preimage",id:"preimage",level:2},{value:"Proof of Stake (PoS)",id:"proof-of-stake-pos",level:2},{value:"Proof of Validity",id:"proof-of-validity",level:2},{value:"Proof of Work (PoW)",id:"proof-of-work-pow",level:2},{value:"Proposal",id:"proposal",level:2},{value:"Protocol",id:"protocol",level:2},{value:"Random Seed",id:"random-seed",level:2},{value:"Referendum",id:"referendum",level:2},{value:"Re-Genesis",id:"re-genesis",level:2},{value:"Relay Chain",id:"relay-chain",level:2},{value:"Remarks",id:"remarks",level:2},{value:"Rococo",id:"rococo",level:2},{value:"Root Origin",id:"root-origin",level:2},{value:"Runtime",id:"runtime",level:2},{value:"Runtime Module",id:"runtime-module",level:2},{value:"Safety",id:"safety",level:2},{value:"Scalability",id:"scalability",level:2},{value:"Sealing",id:"sealing",level:2},{value:"Session",id:"session",level:2},{value:"Session Certificate",id:"session-certificate",level:2},{value:"Session Key",id:"session-key",level:2},{value:"Shared Security",id:"shared-security",level:2},{value:"Slashing",id:"slashing",level:2},{value:"Soft Fork",id:"soft-fork",level:2},{value:"Software Development Kit (SDK)",id:"software-development-kit-sdk",level:2},{value:"Staking",id:"staking",level:2},{value:"State transition function",id:"state-transition-function",level:2},{value:"Substrate",id:"substrate",level:2},{value:"System Parachains",id:"system-parachains",level:2},{value:"Tabling",id:"tabling",level:2},{value:"Teleport",id:"teleport",level:2},{value:"Testnet",id:"testnet",level:2},{value:"Tokenization",id:"tokenization",level:2},{value:"Tracks",id:"tracks",level:2},{value:"Tranche",id:"tranche",level:2},{value:"Transfer",id:"transfer",level:2},{value:"Transaction",id:"transaction",level:2},{value:"Validator",id:"validator",level:2},{value:"Vertical Message Passing",id:"vertical-message-passing",level:2},{value:"Voting",id:"voting",level:2},{value:"Waiting Nomination",id:"waiting-nomination",level:2},{value:"Wallet",id:"wallet",level:2},{value:"Wasm",id:"wasm",level:2},{value:"Watermark",id:"watermark",level:2},{value:"Web3 Foundation",id:"web3-foundation",level:2},{value:"WebAssembly",id:"webassembly",level:2},{value:"Weights",id:"weights",level:2},{value:"Witness",id:"witness",level:2},{value:"Whitelist Pallet",id:"whitelist-pallet",level:2}],p={toc:u},m="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,r);return(0,i.kt)(m,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"active-nomination"},"Active Nomination"),(0,i.kt)("p",null,"A validator (or validators) that a nominator has selected to nominate and is actively validating\nthis era. The nominator is placing their stake behind this validator for this era and will\npotentially receive staking rewards in return for doing so."),(0,i.kt)("h2",{id:"alexander"},"Alexander"),(0,i.kt)("p",null,"The fourth (now defunct) proof of concept (PoC-4) ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," for Polkadot."),(0,i.kt)("h2",{id:"asset-hub"},"Asset Hub"),(0,i.kt)("p",null,"A system parachain used for asset management."),(0,i.kt)("h2",{id:"attestation"},"Attestation"),(0,i.kt)("p",null,"In the Polkadot validity system, an\n",(0,i.kt)("em",{parentName:"p"},"attestation")," is a type of message that validators broadcast that says whether they think a\nparachain candidate block is valid or invalid."),(0,i.kt)("h2",{id:"auction-parachain"},"Auction (Parachain)"),(0,i.kt)("p",null,"Parachain auctions are how non-common-good parathreads win a slot to become a parachain."),(0,i.kt)("h2",{id:"aura"},"Aura"),(0,i.kt)("p",null,"Authority-based round-robin scheduling (AURA) provides a slot-based block authoring mechanism,\nwhere a known set of authorities take turns producing blocks."),(0,i.kt)("h2",{id:"authority"},"Authority"),(0,i.kt)("p",null,"An authority is a generic term for the role in a blockchain that can participate in the consensus\nmechanisms. In ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),", the authorities vote on chains they consider\nfinal. In BABE, the authorities are block producers. Authority sets can be chosen to be mechanisms\nsuch as Polkadot's NPoS algorithm."),(0,i.kt)("h2",{id:"availability-cores"},"Availability Cores"),(0,i.kt)("p",null,"Slots used to process parachains. The runtime assigns each parachain to an availability core and\nvalidators can fetch information about the cores, such as parachain block candidates, by calling the\nappropriate Runtime API."),(0,i.kt)("h2",{id:"babe"},"BABE"),(0,i.kt)("p",null,"Blind Assignment for Blockchain Extension (BABE) is\nPolkadot's block production mechanism."),(0,i.kt)("h2",{id:"bitfield-array"},"Bitfield Array"),(0,i.kt)("p",null,"A bitfield array contains single-bit values which indicate whether a ",(0,i.kt)("a",{parentName:"p",href:"#candidate"},"candidate")," is\navailable. The number of items is equal of to the number of\n",(0,i.kt)("a",{parentName:"p",href:"#availability-cores"},"availability cores")," and each bit represents a vote on the corresponding core\nin the given order."),(0,i.kt)("h2",{id:"block"},"Block"),(0,i.kt)("p",null,"A collection of data, such as transactions, that together indicate a state transition of the\nblockchain."),(0,i.kt)("h2",{id:"blockspace"},"Blockspace"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/blockspace-blockspace-ecosystems-how-polkadot-is-unlocking-the-full-potential-of-web3"},"Blockspace"),"\nis the capacity of a blockchain to finalize and commit operations. It represents a blockchain's\nsecurity, computing, and storage capability as an end product. Blockspace produced by different\nblockchains can vary in quality, availability, and flexibility. Polkadot has a\n",(0,i.kt)("a",{parentName:"p",href:"https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/"},"blockspace-centric architecture"),"."),(0,i.kt)("h2",{id:"block-explorer"},"Block Explorer"),(0,i.kt)("p",null,"An application that allows a user to explore the different blocks on a blockchain."),(0,i.kt)("h2",{id:"blocks-nominations"},"Blocks Nominations"),(0,i.kt)("p",null,"This indicates that a validator does not currently allow any more nominations. This is controlled by\nthe validator."),(0,i.kt)("h2",{id:"bls"},"BLS"),(0,i.kt)("p",null,"Boneh-Lynn-Shacham (BLS) signatures have a slow signing, very slow verification, require slow and\nmuch less secure pairing friendly curves, and tend towards dangerous malleability. Yet, BLS permits\na diverse array of signature aggregation options far beyond any other known signature scheme, which\nmakes BLS a preferred scheme for voting in consensus algorithms and threshold signatures."),(0,i.kt)("h2",{id:"bonding"},"Bonding"),(0,i.kt)("p",null,'A process by which tokens can be "frozen" in exchange for some other benefit. For example, staking\nis a form of bonding for which you receive rewards in exchange for securing the network. You can\nalso bond tokens in exchange for a parachain slot.'),(0,i.kt)("h2",{id:"bounty"},"Bounty"),(0,i.kt)("p",null,"A mechanism which works in some sense as the reverse of a Treasury Proposal, allowing the\nPolkadot Council to indicate that there is a\nneed to do some task for the Polkadot network\nand allowing users to receive DOT in return for working on that task."),(0,i.kt)("h2",{id:"bridge"},"Bridge"),(0,i.kt)("p",null,"A parachain that acts as an intermediary between the\nPolkadot Relay Chain and an external chain, in\nsuch a way that it appears to the Relay Chain that the external chain is a parachain (i.e., meets\nthe Polkadot Host's requirements of\nparachains). Bridges allow for interaction between other blockchains, such as Ethereum and Bitcoin,\nthat are not natively compatible with\nPolkadot."),(0,i.kt)("h2",{id:"byzantine-fault-tolerance"},"Byzantine Fault Tolerance"),(0,i.kt)("p",null,"The property of a system that is tolerant of Byzantine faults; a system where not only may\nindividual subsystems fail, but it may not be clear if a particular subsystem has failed or not.\nThat is, different observers on the system may not agree on whether or not the system has failed.\nEnsuring Byzantine fault tolerance is an important part of developing any distributed system."),(0,i.kt)("h2",{id:"capacity"},"Capacity"),(0,i.kt)("p",null,'The maximum number of nominators signalling intent to nominate a validator (and thus could\npotentially actively nominate that validator in the next session). This maximum number will equal\nthe number of nominators necessary to oversubscribe a validator. Any validator which is "at\ncapacity" or higher may potentially be oversubscribed in the next session; a validator that is not\nat capacity cannot be oversubscribed unless more nominators select it before the next election.'),(0,i.kt)("h2",{id:"candidate"},"Candidate"),(0,i.kt)("p",null,"A candidate is a submitted parachain block to the relay chain validators. A parachain block stops\nbeing referred to as a candidate as soon it has been finalized."),(0,i.kt)("h2",{id:"collations"},"Collations"),(0,i.kt)("p",null,"Parachain blocks or candidates that are being proposed to the\nPolkadot relay chain validators. More\nspecifically, a collation is a ",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#defn-collation"},"data structure")," which\ncontains the proposed parachain candidate, including an optional validation parachain Runtime update\nand upward messages."),(0,i.kt)("h2",{id:"collator"},"Collator"),(0,i.kt)("p",null,"A node that maintains a parachain by collecting parachain transactions and producing state\ntransition proofs for the validators."),(0,i.kt)("h2",{id:"collectives"},"Collectives"),(0,i.kt)("p",null,"The Polkadot Collectives parachain was added in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/81"},"Referendum 81")," and exists only on Polkadot (i.e.,\nthere is no Kusama equivalent). The Collectives chain hosts on-chain collectives that serve the\nPolkadot network, such as the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," and ",(0,i.kt)("a",{parentName:"p",href:"#polkadot-alliance"},"Polkadot Alliance"),"."),(0,i.kt)("h2",{id:"commission"},"Commission"),(0,i.kt)("p",null,"Validators and nominators get paid from block production on the network, where validators can set a\nvariable commission rate, which is initially subtracted from the total rewards that validator is\nentitled to (for that period), where the commission determines the rate of distribution for the\nremaining rewards set out for the nominators that are backing that validator."),(0,i.kt)("h2",{id:"common-good-parachain"},"Common Good (Parachain)"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#system-parachains"},"System Parachains"),', which is generally preferred over the term "common\ngood".'),(0,i.kt)("h2",{id:"community-queue"},"Community Queue"),(0,i.kt)("p",null,"The queue for proposals originating from individual accounts (i.e. not the Council) which are\nwaiting to become referenda. Compare the External queue."),(0,i.kt)("h2",{id:"consensus"},"Consensus"),(0,i.kt)("p",null,"The process of a group of entities to agree on a particular data value (such as the ordering and\nmakeup of blocks on a blockchain). There are a variety of algorithms used for determining consensus.\nThe consensus algorithm used by Polkadot is\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"crowdloan"},"Crowdloan"),(0,i.kt)("p",null,"A mechanism for potential parachains to temporarily source tokens to win an auction for a parachain\nslot. Tokens gathered in this way are programmatically returned to the lender after the lease period\nis over or the crowdloan period ends."),(0,i.kt)("h2",{id:"curator"},"Curator"),(0,i.kt)("p",null,"A person, group, or other entity charged with judging and verifying the successful completion of a\nBounty."),(0,i.kt)("h2",{id:"dapps"},"Dapps"),(0,i.kt)("p",null,"A generic term for a decentralized application, that is, one that runs as part of a distributed\nnetwork as opposed to being run on a specific system or set of systems."),(0,i.kt)("h2",{id:"dot"},"DOT"),(0,i.kt)("p",null,'The native token for Polkadot. DOT serves three purposes: network governance (allowing them to vote\non-chain upgrades and other exceptional events), general operation (rewarding good actors and\npunishing bad actors), and bonding (adding new parachains by "freezing" DOT while they are connected\nthe Relay Chain).'),(0,i.kt)("h2",{id:"duty-roster"},"Duty Roster"),(0,i.kt)("p",null,"A lookup table that specifies the job that a particular validator is required to do (i.e. attest to\nthe validity of a specific parachain). The duty roster routinely shuffles the validator set into\ndifferent subsets per parachain."),(0,i.kt)("h2",{id:"epoch"},"Epoch"),(0,i.kt)("p",null,"An epoch is a time duration in the BABE protocol that is broken into smaller time slots. Each slot\nhas at least one slot leader who has the right to propose a block. In Kusama, it is the same\nduration as a ",(0,i.kt)("a",{parentName:"p",href:"#session"},"session"),"."),(0,i.kt)("h2",{id:"era"},"Era"),(0,i.kt)("p",null,"A (whole) number of sessions, which is the period that the validator set (and each validator's\nactive nominator set) is recalculated and where rewards are paid out."),(0,i.kt)("h2",{id:"equivocation"},"Equivocation"),(0,i.kt)("p",null,"Providing conflicting information to the network. BABE equivocation entails creating multiple blocks\nin the same slot. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," equivocation would consist of signing multiple\nconflicting chains."),(0,i.kt)("h2",{id:"external-queue"},"External Queue"),(0,i.kt)("p",null,"The queue for proposals originating with the\nPolkadot Council which are waiting to become\nreferenda. Compare the Community queue."),(0,i.kt)("h2",{id:"extrinsic"},"Extrinsic"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE encoded"),' array consisting of a version\nnumber, signature, and varying data types indicating the resulting runtime function to be called,\nincluding the parameters required for that function to be executed. These state changes are invoked\nfrom the outside world, i.e. they are not part of the system itself. Extrinsics can take two forms,\n"',(0,i.kt)("a",{parentName:"p",href:"#inherent"},"inherents"),'" and "',(0,i.kt)("a",{parentName:"p",href:"#transaction"},"transactions"),'". For more technical details see the\n',(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#id-extrinsics"},"polkadot spec")),(0,i.kt)("h2",{id:"fellowship"},"Fellowship"),(0,i.kt)("p",null,"A mostly self-governing expert body with a primary goal of representing humans who embody and\ncontain the technical knowledge base of the Kusama and/or Polkadot networks and protocols."),(0,i.kt)("h2",{id:"finality"},"Finality"),(0,i.kt)("p",null,'The property of a block that cannot be reverted. Generally, created blocks are not final until some\npoint in the future - perhaps never, in the case of "probabilistic finality". The\nPolkadot Relay Chain uses a deterministic\nfinality gadget known as ',(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"finality-gadget"},"Finality Gadget"),(0,i.kt)("p",null,"A mechanism that determines finality."),(0,i.kt)("h2",{id:"frame"},"Frame"),(0,i.kt)("p",null,"The collection of Substrate-provided pallets (Substrate Runtime Modules)."),(0,i.kt)("h2",{id:"genesis"},"Genesis"),(0,i.kt)("p",null,"The origin of a blockchain, also known as block 0. It can also be used to reference the initial\nstate of the blockchain at origination."),(0,i.kt)("admonition",{title:"Example",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"In the ",(0,i.kt)("em",{parentName:"p"},"genesis")," state Alice, Bob, and Charlie had 30 tokens each.")),(0,i.kt)("h2",{id:"governance"},"Governance"),(0,i.kt)("p",null,"The process of determining what changes to the network are permissible, such as modifications to\ncode or movement of funds. The governance system in\nPolkadot is on-chain and revolves around\nstakeholder voting."),(0,i.kt)("h2",{id:"governance-council"},"Governance Council"),(0,i.kt)("p",null,'An on-chain entity that consists of several on-chain accounts (starting at 6, eventually moving to\nthe final value of 24). The Council can act as a representative for "passive" (non-voting)\nstakeholders. Council members have two main tasks: proposing referenda for the overall stakeholder\ngroup to vote on and cancelling malicious referenda.'),(0,i.kt)("h2",{id:"grandpa-finality-gadget"},"GRANDPA Finality Gadget"),(0,i.kt)("p",null,"GHOST-based Recursive ANcestor Deriving Prefix Agreement. It is the finality gadget for\nPolkadot, which allows asynchronous,\naccountable, and safe finality to the blockchain. For an overview of GRANDPA, see\n",(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/polkadot-proof-of-concept-3-a-better-consensus-algorithm-e81c380a2372"},"this Medium post")),(0,i.kt)("h2",{id:"hard-fork"},"Hard Fork"),(0,i.kt)("p",null,"A permanent diversion of a blockchain occurs quickly due to a high priority change in a consensus\nrule. Clients who follow a hard fork always need to upgrade their clients to continue following the\nupgraded chain. Hard forks are considered permanent divergences of a chain for which non-upgraded\nclients are following consensus rules incompatible to the ones followed by upgraded clients."),(0,i.kt)("h2",{id:"hard-spoon"},"Hard Spoon"),(0,i.kt)("p",null,'Defined by Jae Kwon of Cosmos as "a new chain that takes into account state from an existing chain;\nnot to compete, but to provide broad access." A non-contentious blockchain that inherits the state\nof the underlying blockchain and creates a new branch of ',(0,i.kt)("em",{parentName:"p"},"the same blockchain"),"."),(0,i.kt)("h2",{id:"horizontal-relay-routed-message-passing"},"Horizontal Relay-routed Message Passing"),(0,i.kt)("p",null,"Horizontal Relay-routed Message Passing, also known as HRMP, is a precursor to the complete XCMP\nimplementation, that mimics the same interface and semantics of XCMP. It is similar to XCMP except\nfor how it stores all messages in the Relay Chain storage, therefore making it more expensive and\ndemanding more resources than XCMP. The plan is to retire HRMP once the implementation of XCMP is\ncomplete."),(0,i.kt)("h2",{id:"inactive-nomination"},"Inactive Nomination"),(0,i.kt)("p",null,"A validator (or validators) that a nominator has selected to nominate, but is not actively\nvalidating this era. This type of nomination may become active in a future era."),(0,i.kt)("h2",{id:"inherent"},"Inherent"),(0,i.kt)("p",null,'Extrinsics that are "inherently true." Inherents are not gossiped on the network and are put into\nblocks by the block author. They are not provably true the way that the desire to send funds is,\ntherefore they do not carry a signature. A blockchain\'s ',(0,i.kt)("a",{parentName:"p",href:"#runtime"},"runtime")," must have rules for\nvalidating inherents. For example, timestamps are inherents. They are validated by being within some\nmargin that each validator deems reasonable."),(0,i.kt)("h2",{id:"injected-account"},"Injected Account"),(0,i.kt)("p",null,"An account that is not directly managed by the Polkadot UI but can be accessed through it, such as\naccounts controlled by the Polkadot{.js} extension."),(0,i.kt)("h2",{id:"interoperability"},"Interoperability"),(0,i.kt)("p",null,'The ability for some sort of system to exchange and make use of information often compared to\n"cross-chain" technologies.'),(0,i.kt)("h2",{id:"keep-alive-check"},"Keep-Alive Check"),(0,i.kt)("p",null,"The keep-alive check is used to indicate whether or not a transfer can allow the sending account to\nbe reduced to less than the existential deposit, causing it to be reaped."),(0,i.kt)("h2",{id:"ksm"},"KSM"),(0,i.kt)("p",null,"The abbreviation for Kusama network tokens."),(0,i.kt)("h2",{id:"kusama"},"Kusama"),(0,i.kt)("p",null,'The "canary network" for Polkadot. It consists of an early-release, unaudited version of the\nPolkadot software. It is ',(0,i.kt)("strong",{parentName:"p"},"not")," a ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," - after the transition to NPoS, the network\nis entirely in the hands of the community (i.e., Kusama token holders)."),(0,i.kt)("h2",{id:"lease-period"},"Lease Period"),(0,i.kt)("p",null,"A particular amount of time that a parachain for which the parachain can connect to the Relay Chain."),(0,i.kt)("h2",{id:"libp2p"},"LIBP2P"),(0,i.kt)("p",null,"An open-source library for encrypted peer-to-peer communications and other networking functions.\nMore information at: ",(0,i.kt)("a",{parentName:"p",href:"https://libp2p.io/"},"https://libp2p.io/")),(0,i.kt)("h2",{id:"liveness"},"Liveness"),(0,i.kt)("p",null,"The property of a distributed system is that it will eventually come to some sort of consensus. A\nsystem stuck in an infinite loop would not be considered live, even if computations are taking\nplace; a system that eventually provides a result, even if incorrect or it takes a long time, is\nconsidered to have liveness."),(0,i.kt)("h2",{id:"mainnet"},"Mainnet"),(0,i.kt)("p",null,'Short for "main network": the fully functional and acting chain that runs its own network.'),(0,i.kt)("h2",{id:"message"},"Message"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message")," is\narbitrary data that is sent from one parachain (the egress chain) to another (the ingress chain)\nthrough a channel and ensured delivery by the validator set."),(0,i.kt)("h2",{id:"message-queue"},"Message Queue"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message queue"),"\nis the list of messages waiting to be processed by a particular receiving parachain over a channel."),(0,i.kt)("h2",{id:"metadata"},"Metadata"),(0,i.kt)("p",null,"Data that includes information about other data, such as information about a specific transaction."),(0,i.kt)("h2",{id:"motion"},"Motion"),(0,i.kt)("p",null,'A motion is essentially a "referendum" or "decision" being considered by the Council. The Council\ncan vote on motions like approving Treasury Proposals or making proposals for the community to vote\non.'),(0,i.kt)("h2",{id:"next-session"},"Next Session"),(0,i.kt)("p",null,"This indicates that the validator will be a member of the active set in the next session."),(0,i.kt)("h2",{id:"node-explorer"},"Node Explorer"),(0,i.kt)("p",null,"A tool that gives you information about a node, such as the latest blocks sealed, finalized, and the\ncurrent chain state as known by that node."),(0,i.kt)("h2",{id:"nominated-proof-of-stake-npos"},"Nominated Proof of Stake (NPoS)"),(0,i.kt)("p",null,"A Proof-of-Stake system where nominators back validators with their own stake as a show of faith in\nthe good behavior of the validator. Nominated Proof-of-Stake differs from the more generic concept\nDelegated Proof-of-Stake in that nominators are subject to loss of stake if they nominate a bad\nvalidator; delegators are not subject to loss of stake based on the behavior of the validator. Note\nthat some other blockchain technologies may use the term Delegated Proof-of-Stake, even if\ndelegators can be slashed. Polkadot uses the\nPhragm\xe9n method to allocate stake to nominees."),(0,i.kt)("h2",{id:"nominator"},"Nominator"),(0,i.kt)("p",null,"Accounts that select a set of validators to nominate by bonding their tokens. Nominators receive\nsome of the validators' rewards, but are also liable for slashing if their nominated validators\nmisbehave."),(0,i.kt)("h2",{id:"non-fungible-token-nft"},"Non-fungible Token (NFT)"),(0,i.kt)("p",null,"A non-fungible token is a token that does not hold the property of fungibility, which, in turn,\nmeans that it cannot be interchangeable and indistinguishable from other tokens. NFTs allow the\ntokenization of unique items and provide exclusive ownership for those tokens."),(0,i.kt)("h2",{id:"on-chain-governance"},"On-chain Governance"),(0,i.kt)("p",null,"A governance system of a blockchain that is controlled by mechanisms on the blockchain. On-chain\ngovernance allows decisions to be made transparently. Note that there are a variety of different\nalgorithms for making these decisions, such as simple majority voting, adaptive quorum biasing, or\nidentity-based quadratic voting."),(0,i.kt)("h2",{id:"online-message"},"Online Message"),(0,i.kt)("p",null,'This is a message that is broadcast by a validator to verify to the network that the validator is\nonline, even if they haven\'t published a block this epoch. This is sometimes referred to as\n"ImOnline".'),(0,i.kt)("h2",{id:"polkadot-opengov"},"Polkadot OpenGov"),(0,i.kt)("p",null,"Previously known as Governance v2 (Gov2) during early development,\n",(0,i.kt)("a",{parentName:"p",href:"../learn/learn-polkadot-opengov"},"Polkadot OpenGov")," serves as the current governance protocol for\nboth Kusama and Polkadot."),(0,i.kt)("h2",{id:"origin"},"Origin"),(0,i.kt)("p",null,"The initiator of an extrinsic. A simple origin would be the account that is sending a token to\nanother account. Polkadot also supports more\ncomplex origin types, such as the ",(0,i.kt)("a",{parentName:"p",href:"#root-origin"},"root origin"),", from which privileged functions can\nbe called."),(0,i.kt)("h2",{id:"oversubscribed"},"Oversubscribed"),(0,i.kt)("p",null,'If more than the maximum number of nominators nominate the same validator, it is "oversubscribed",\nand only the top staked nominators (ranked by the amount of stake, up to the maximum number of\nnominators) are paid rewards. Other nominators will receive no rewards for that era. The current\nmaximum number of nominators is\n',(0,i.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"})," on Polkadot,\n","\nbut it can be modified via governance."),(0,i.kt)("h2",{id:"pallet"},"Pallet"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"#substrate"},"Substrate")," runtime module."),(0,i.kt)("h2",{id:"parachain"},"Parachain"),(0,i.kt)("p",null,'A blockchain that meets several characteristics that allow it to work within the confines of the\nPolkadot Host. Also known as "parallelized\nchain."'),(0,i.kt)("h2",{id:"parachain-development-kit-pdk"},"Parachain Development Kit (PDK)"),(0,i.kt)("p",null,"Similar to an ",(0,i.kt)("a",{parentName:"p",href:"#sdk"},"SDK"),", parachain development kits (PDK) is a set of tools that make it easy for\ndevelopers to create Polkadot compatible\n",(0,i.kt)("a",{parentName:"p",href:"#parachain"},"parachains"),"."),(0,i.kt)("h2",{id:"paraid"},"ParaID"),(0,i.kt)("p",null,"A unique numeric (non-negative integer) identifier for a parathread."),(0,i.kt)("h2",{id:"parathread"},"Parathread"),(0,i.kt)("p",null,'A blockchain that works within the confines of the\nPolkadot Host, thus allowing it to connect to\nthe Polkadot Relay Chain. This can be done either by becoming a parachain or connecting on a "pay as\nyou go" basis. All parachains start their life-cycle as a parathread.'),(0,i.kt)("h2",{id:"parachain-registry"},"Parachain Registry"),(0,i.kt)("p",null,"A relatively simple database-like construct that holds both static and dynamic information on each\nchain."),(0,i.kt)("h2",{id:"parity-technologies"},"Parity Technologies"),(0,i.kt)("p",null,"A company, founded by Dr. Gavin Wood and Dr. Jutta Steiner, that is developing Substrate, Kusama and\nPolkadot. It has also released several other projects including Parity Ethereum and Parity Secret\nStore."),(0,i.kt)("h2",{id:"polkadot"},"Polkadot"),(0,i.kt)("p",null,"A heterogeneous, multi-chain network allowing various blockchains of different characteristics to\nperform arbitrary, cross-chain communication under shared security."),(0,i.kt)("h2",{id:"polkadot-alliance"},"Polkadot Alliance"),(0,i.kt)("p",null,"The Polkadot Alliance is an ",(0,i.kt)("a",{parentName:"p",href:"#collectives"},"on-chain collective")," founded by Acala, Astar, Interlay,\nKilt, Moonbeam, Phala, and Subscan, to establish standards and ethics for open-source development in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/94"},"referendum #94"),". It aims to support development\nstandards and expose bad actors within the ecosystems of Polkadot."),(0,i.kt)("h2",{id:"host"},"Host"),(0,i.kt)("p",null,"The environment in which a runtime module can be executed. Parachains must support the\nPolkadot Host - external chains that do not\nwill have to use a bridge. Previously known as the\nPolkadot Runtime Environment."),(0,i.kt)("h2",{id:"runtime-environment"},"Runtime Environment"),(0,i.kt)("p",null,"The previous name for the Polkadot\n",(0,i.kt)("a",{parentName:"p",href:"#polkadot-host"},"Host"),"."),(0,i.kt)("h2",{id:"preimage"},"Preimage"),(0,i.kt)("p",null,"The on-chain proposals do not require the entire image of extrinsics and data (for instance the WASM\ncode, in case of upgrades) to be submitted, but would rather just need that image's hash. That\n",(0,i.kt)("strong",{parentName:"p"},"preimage")," can be submitted and stored on-chain against the hash later, upon the proposal's\ndispatch."),(0,i.kt)("h2",{id:"proof-of-stake-pos"},"Proof of Stake (PoS)"),(0,i.kt)("p",null,"A method of selecting participation in a consensus system, in which participants are chosen based on\nhow many tokens they have at stake (at risk of loss due to misbehavior). Normally, Proof-of-Stake\nsystems limit the number of participants."),(0,i.kt)("h2",{id:"proof-of-validity"},"Proof of Validity"),(0,i.kt)("p",null,"A proof produced by parachain collators. Based on this proof and the parachain registry, a validator\ncan verify that a parachain has properly executed its state transition function. Proofs of Validity\ngo into the Relay Chain blocks."),(0,i.kt)("h2",{id:"proof-of-work-pow"},"Proof of Work (PoW)"),(0,i.kt)("p",null,"A method of selecting participants in a consensus system, typically the longest chain rule, in which\nparticipants try to solve a puzzle like finding a partial pre-image of a hash. Normally, a\nProof-of-Work system can have any number of participants."),(0,i.kt)("h2",{id:"proposal"},"Proposal"),(0,i.kt)("p",null,"A potential function call to be voted on in a referendum. Proposals modify the behavior of the\nPolkadot network, from minor parameter tuning\nup to replacing the runtime code."),(0,i.kt)("h2",{id:"protocol"},"Protocol"),(0,i.kt)("p",null,"A system of rules that allows two or more entities of a communications system to transmit\ninformation. The protocol defines the rules, syntax, semantics, and synchronization of communication\nand possible recovery methods."),(0,i.kt)("h2",{id:"random-seed"},"Random Seed"),(0,i.kt)("p",null,"A random seed is a pseudo-random number available on-chain. It is used in various places of the\nPolkadot protocol, most prominently in\n",(0,i.kt)("a",{parentName:"p",href:"#babe"},"BABE")," the block production mechanism."),(0,i.kt)("h2",{id:"referendum"},"Referendum"),(0,i.kt)("p",null,"A vote on whether or not a proposal should be accepted by the network. Referenda may be initiated by\nthe Governance Council, by a member of the public, or as the result of a previous proposal.\nStakeholders vote on referenda, weighted by both the size of their stake (i.e. number of DOT held)\nand the amount of time they are willing to lock their tokens."),(0,i.kt)("h2",{id:"re-genesis"},"Re-Genesis"),(0,i.kt)("p",null,"Re-Genesis is the process of exporting the current chain state, and creating a new chain that builds\non it. Re-Genesis will involve stop-the-world migration, which results in a period of time when no\nactual blocks are added to the blockchain. In a way, re-genesis can be viewed as a hard fork\nprocess. A formal design of Re-Genesis on Substrate is still under development -\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/issues/7458"},"Re-Genesis Rationale and Design"),"."),(0,i.kt)("h2",{id:"relay-chain"},"Relay Chain"),(0,i.kt)("p",null,"The chain that coordinates consensus and communication between parachains (and external chains, via\nbridges)."),(0,i.kt)("h2",{id:"remarks"},"Remarks"),(0,i.kt)("p",null,"Remarks are extrinsics with no effect. They provide additional information to external inputs,\nacting as ",(0,i.kt)("em",{parentName:"p"},"notes"),". Remarks are stored alongside block records and do not change the chain's storage;\nthe information is not stored in the chain's trie, but along blocks."),(0,i.kt)("h2",{id:"rococo"},"Rococo"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," set aside for testing parachains, cumulus, and related technology."),(0,i.kt)("h2",{id:"root-origin"},"Root Origin"),(0,i.kt)("p",null,"A system-level origin in ",(0,i.kt)("a",{parentName:"p",href:"#Substrate"},"Substrate"),". This is the highest privilege level and can be\nthought of as the superuser of the runtime origin. To learn about more raw origins in Substrate,\nvisit ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/origins/"},"Substrate Docs")),(0,i.kt)("h2",{id:"runtime"},"Runtime"),(0,i.kt)("p",null,"The state transition function of a blockchain. It defines a valid algorithm for determining the\nstate of the next block given the previous state."),(0,i.kt)("h2",{id:"runtime-module"},"Runtime Module"),(0,i.kt)("p",null,'A module that implements specific transition functions and features one might want to have in their\nruntime. Each module should have domain-specific logic. For example, a Balances module has logic to\ndeal with accounts and balances. In Substrate, modules are called "pallets".'),(0,i.kt)("h2",{id:"safety"},"Safety"),(0,i.kt)("p",null,"The property of a distributed system indicating that a particular state transition will not be\nreverted. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," provides ",(0,i.kt)("em",{parentName:"p"},"deterministic"),' safety. That is, for a state\nchanged marked as "safe" or "final", one would require a hard fork to revert that change.'),(0,i.kt)("h2",{id:"scalability"},"Scalability"),(0,i.kt)("p",null,"While an ambiguous concept, ","[blockchain]"," scalability can be understood as the ability for the\nnetwork to scale in capabilities (e.g. processing more transactions) when needed."),(0,i.kt)("h2",{id:"sealing"},"Sealing"),(0,i.kt)("p",null,"The process of adding a block to the Relay Chain. Note that finalization is a separate process -\nblocks are finalized sometime after they are sealed."),(0,i.kt)("h2",{id:"session"},"Session"),(0,i.kt)("p",null,"A session is a Substrate implementation term for a period that has a constant set of validators.\nValidators can only join or exit the validator set at a session change."),(0,i.kt)("h2",{id:"session-certificate"},"Session Certificate"),(0,i.kt)("p",null,"A message containing a signature on the concatenation of all the Session keys."),(0,i.kt)("h2",{id:"session-key"},"Session Key"),(0,i.kt)("p",null,"Hot keys that are used for performing network operations by validators, for example, signing\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," commit messages."),(0,i.kt)("h2",{id:"shared-security"},"Shared Security"),(0,i.kt)("p",null,"The security model that Polkadot uses whereby\nall chains are equally secured. This is achieved by placing proofs of the validity of parachain\nblocks into the Relay Chain such that, in order to revert finality of a single parachain, an\nattacker would need to attack the entire\nPolkadot system."),(0,i.kt)("h2",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"The removal of a percentage of an account's DOT as a punishment for a validator acting maliciously\nor incompetently (e.g., equivocating or remaining offline for an extended period)."),(0,i.kt)("h2",{id:"soft-fork"},"Soft Fork"),(0,i.kt)("p",null,'A backward compatible change to client code causes upgraded clients to start mining a new chain.\nRequires a "vote-by-hashrate" of a majority of miners to enact successfully. Soft forks are\nconsidered temporary divergences in a chain since non-upgraded clients do not follow the new\nconsensus rules but upgraded clients are still compatible with old consensus rules.'),(0,i.kt)("h2",{id:"software-development-kit-sdk"},"Software Development Kit (SDK)"),(0,i.kt)("p",null,"A collection of software tools (and programs) packaged together that can be used to develop\nsoftware."),(0,i.kt)("h2",{id:"staking"},"Staking"),(0,i.kt)("p",null,'The act of bonding tokens for Polkadot (DOT)\nby putting them up as "collateral" for a chance to produce a\nvalid block (and thus obtain a block reward). Validators and nominators stake their\nDOT in order to secure the network.'),(0,i.kt)("h2",{id:"state-transition-function"},"State transition function"),(0,i.kt)("p",null,"A function that describes how the state of a blockchain can be transformed. For example, it may\ndescribe how tokens can be transferred from one account to another."),(0,i.kt)("h2",{id:"substrate"},"Substrate"),(0,i.kt)("p",null,"A modular framework for building blockchains.\nPolkadot is built using\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.io/"},"Substrate"),". Chains built with Substrate will be easy to connect as\nparachains. For developers, see the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate"},"Substrate GitHub repository"),"."),(0,i.kt)("h2",{id:"system-parachains"},"System Parachains"),(0,i.kt)("p",null,"Parachains that are part of the Polkadot core protocol. These are allocated a parachain execution\ncore by governance rather than auction."),(0,i.kt)("h2",{id:"tabling"},"Tabling"),(0,i.kt)("p",null,'In Polkadot governance, bringing a proposal to\na vote via referendum. Note that this is the British meaning of "tabling", which is different from\nthe US version, which means "to postpone" a measure.'),(0,i.kt)("h2",{id:"teleport"},"Teleport"),(0,i.kt)("p",null,"Send an asset from an account on one chain to an account on a different chain. This occurs by\nburning an amount on the sending chain and minting an equivalent amount on the destination chain."),(0,i.kt)("h2",{id:"testnet"},"Testnet"),(0,i.kt)("p",null,'Short for "test network": an experimental network where testing and development takes place.\nNetworks are often executed on a testnet before they are deployed to a ',(0,i.kt)("a",{parentName:"p",href:"#mainnet"},"mainnet"),"."),(0,i.kt)("h2",{id:"tokenization"},"Tokenization"),(0,i.kt)("p",null,"The process of replacing sensitive data with non-sensitive data."),(0,i.kt)("h2",{id:"tracks"},"Tracks"),(0,i.kt)("p",null,"Each ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin")," is associated with a single referendum class and each class is associated\nwith a ",(0,i.kt)("a",{parentName:"p",href:"../maintain/maintain-guides-polkadot-opengov#origins-and-tracks"},"Track"),". The Track outlines\nthe lifecycle for the proposal and is independent from other class's tracks. Having independent\ntracks allows the network to tailor the dynamics of referenda based upon their implied privilege\nlevel."),(0,i.kt)("h2",{id:"tranche"},"Tranche"),(0,i.kt)("p",null,"Validators use a subjective, tick-based system to determine when the approval process should start.\nA validator starts the tick-based system when a new availability core candidates have been proposed,\nwhich can be retrieved via the\n",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-rt-api-availability-cores"},"Runtime API"),", and increments the\ntick every 500 milliseconds. Each tick/increment is referred to as a \u201ctranche\u201d, represented as an\ninteger, starting at 0."),(0,i.kt)("h2",{id:"transfer"},"Transfer"),(0,i.kt)("p",null,"Send an asset from one account to another. This generally refers to transfers that occur only on the\nsame chain."),(0,i.kt)("h2",{id:"transaction"},"Transaction"),(0,i.kt)("p",null,'An extrinsic that is signed. Transactions are gossiped on the network and incur a transaction fee.\nTransactions are "provably true", unlike inherents. For example, one can prove that Alice wants to\nsend funds to Bob by the fact that she signed a transfer-funds message with her private key.'),(0,i.kt)("h2",{id:"validator"},"Validator"),(0,i.kt)("p",null,"A node that secures the Relay Chain by staking DOT, validating proofs from collators on parachains\nand voting on consensus along with other validators."),(0,i.kt)("h2",{id:"vertical-message-passing"},"Vertical Message Passing"),(0,i.kt)("p",null,"Vertical message passing consists of two separate types of message passing, Downward Message Passing\n(DMP) and Upward Message Passing (UMP). Downward messages pass from the Relay Chain to a parachain,\nalthough they may also originate from another parachain via\n",(0,i.kt)("a",{parentName:"p",href:"#Horizontal-Relay-routed-Message-Passing"},"HRMP"),". Upward messages originate from parachains and go\nup to the Relay Chain via runtime entry points."),(0,i.kt)("h2",{id:"voting"},"Voting"),(0,i.kt)("p",null,"The process of stakeholders determining whether or not a referendum should pass. Votes are weighted\nboth by the number of DOT that the stakeholder account controls and the amount of time they are\nwilling to lock their DOT."),(0,i.kt)("h2",{id:"waiting-nomination"},"Waiting Nomination"),(0,i.kt)("p",null,"The nominator has nominated this validator, but the validator was not elected into the active\nvalidator set this era and thus cannot produce blocks for the canonical chain. If the validator does\nget into the active set in a future era, this may turn into an active or inactive nomination."),(0,i.kt)("h2",{id:"wallet"},"Wallet"),(0,i.kt)("p",null,"A program that allows one to store private keys and sign transactions for\nPolkadot or other blockchain networks."),(0,i.kt)("h2",{id:"wasm"},"Wasm"),(0,i.kt)("p",null,"The abbreviation for ",(0,i.kt)("a",{parentName:"p",href:"#webassembly"},"WebAssembly"),"."),(0,i.kt)("h2",{id:"watermark"},"Watermark"),(0,i.kt)("p",null,"In Polkadot's parachain messaging scheme, the ",(0,i.kt)("em",{parentName:"p"},"watermark")," is the minimum processed send-height of\nthe receiving parachain. All messages on all channels that are sending to this parachain at or\nbefore the watermark are guaranteed to be processed."),(0,i.kt)("h2",{id:"web3-foundation"},"Web3 Foundation"),(0,i.kt)("p",null,"A Switzerland-based foundation that nurtures and stewards technologies and applications in the\nfields of decentralized web software protocols, particularly those that utilize modern cryptographic\nmethods to safeguard decentralization, to the benefit and for the stability of the Web3 ecosystem."),(0,i.kt)("h2",{id:"webassembly"},"WebAssembly"),(0,i.kt)("p",null,"An instruction format for a virtual, stack-based machine.\nPolkadot Runtime Modules are compiled to\nWebAssembly. Also known as Wasm."),(0,i.kt)("h2",{id:"weights"},"Weights"),(0,i.kt)("p",null,"A permission-less system needs to implement a mechanism to measure and limit usage in order to\nestablish an economic incentive structure, to prevent the network overload, and to mitigate DoS\nvulnerabilities. This mechanism must enforce a limited time-window for block producers to create a\nblock and include limitations on block size, to prevent execution of certain extrinsics which are\ndeemed too expensive and could decelerate the network. This is handled by the weight system, where\nthe cost of the transactions (referred to as ",(0,i.kt)("a",{parentName:"p",href:"#extrinsic"},"extrinsics"),") are determined before\nexecution. Checkout this section of the Substrate docs covering\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/build/tx-weights-fees/"},"transaction weights and fees"),"."),(0,i.kt)("h2",{id:"witness"},"Witness"),(0,i.kt)("p",null,"Cryptographic proof statements of data validity."),(0,i.kt)("h2",{id:"whitelist-pallet"},"Whitelist Pallet"),(0,i.kt)("p",null,"Allows one ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin ")," to escalate the privilege level of another Origin for a certain\noperation. In terms of OpenGov, it allows the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," to authorise a new origin\n(which we will call Whitelisted-Root) to be executed with Root-level privileges."))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/493c7fdf.cb8f9adb.js b/assets/js/493c7fdf.cb8f9adb.js new file mode 100644 index 000000000000..d735e629743a --- /dev/null +++ b/assets/js/493c7fdf.cb8f9adb.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2354],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),s=a(87152),r=a(34200),l=a(67425);function d(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,c,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(i),e.next=21,r.G.create({provider:d});case 21:c=e.sent,(h=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,c=(0,i.useState)(""),u=c[0],p=c[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(s.toString(),l,t,p):p(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,p);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,p):p(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},22703:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},d=void 0,c={unversionedId:"general/glossary",id:"general/glossary",title:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",source:"@site/../docs/general/glossary.md",sourceDirName:"general",slug:"/glossary",permalink:"/docs/glossary",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/glossary.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695017532,formattedLastUpdatedAt:"Sep 18, 2023",frontMatter:{id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/faq"},next:{title:"Learn",permalink:"/docs/learn-index"}},h={},u=[{value:"Active Nomination",id:"active-nomination",level:2},{value:"Alexander",id:"alexander",level:2},{value:"Asset Hub",id:"asset-hub",level:2},{value:"Attestation",id:"attestation",level:2},{value:"Auction (Parachain)",id:"auction-parachain",level:2},{value:"Aura",id:"aura",level:2},{value:"Authority",id:"authority",level:2},{value:"Availability Cores",id:"availability-cores",level:2},{value:"BABE",id:"babe",level:2},{value:"Bitfield Array",id:"bitfield-array",level:2},{value:"Block",id:"block",level:2},{value:"Blockspace",id:"blockspace",level:2},{value:"Block Explorer",id:"block-explorer",level:2},{value:"Blocks Nominations",id:"blocks-nominations",level:2},{value:"BLS",id:"bls",level:2},{value:"Bonding",id:"bonding",level:2},{value:"Bounty",id:"bounty",level:2},{value:"Bridge",id:"bridge",level:2},{value:"Byzantine Fault Tolerance",id:"byzantine-fault-tolerance",level:2},{value:"Capacity",id:"capacity",level:2},{value:"Candidate",id:"candidate",level:2},{value:"Collations",id:"collations",level:2},{value:"Collator",id:"collator",level:2},{value:"Collectives",id:"collectives",level:2},{value:"Commission",id:"commission",level:2},{value:"Common Good (Parachain)",id:"common-good-parachain",level:2},{value:"Community Queue",id:"community-queue",level:2},{value:"Consensus",id:"consensus",level:2},{value:"Crowdloan",id:"crowdloan",level:2},{value:"Curator",id:"curator",level:2},{value:"Dapps",id:"dapps",level:2},{value:"DOT",id:"dot",level:2},{value:"Duty Roster",id:"duty-roster",level:2},{value:"Epoch",id:"epoch",level:2},{value:"Era",id:"era",level:2},{value:"Equivocation",id:"equivocation",level:2},{value:"External Queue",id:"external-queue",level:2},{value:"Extrinsic",id:"extrinsic",level:2},{value:"Fellowship",id:"fellowship",level:2},{value:"Finality",id:"finality",level:2},{value:"Finality Gadget",id:"finality-gadget",level:2},{value:"Frame",id:"frame",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Governance",id:"governance",level:2},{value:"Governance Council",id:"governance-council",level:2},{value:"GRANDPA Finality Gadget",id:"grandpa-finality-gadget",level:2},{value:"Hard Fork",id:"hard-fork",level:2},{value:"Hard Spoon",id:"hard-spoon",level:2},{value:"Horizontal Relay-routed Message Passing",id:"horizontal-relay-routed-message-passing",level:2},{value:"Inactive Nomination",id:"inactive-nomination",level:2},{value:"Inherent",id:"inherent",level:2},{value:"Injected Account",id:"injected-account",level:2},{value:"Interoperability",id:"interoperability",level:2},{value:"Keep-Alive Check",id:"keep-alive-check",level:2},{value:"KSM",id:"ksm",level:2},{value:"Kusama",id:"kusama",level:2},{value:"Lease Period",id:"lease-period",level:2},{value:"LIBP2P",id:"libp2p",level:2},{value:"Liveness",id:"liveness",level:2},{value:"Mainnet",id:"mainnet",level:2},{value:"Message",id:"message",level:2},{value:"Message Queue",id:"message-queue",level:2},{value:"Metadata",id:"metadata",level:2},{value:"Motion",id:"motion",level:2},{value:"Next Session",id:"next-session",level:2},{value:"Node Explorer",id:"node-explorer",level:2},{value:"Nominated Proof of Stake (NPoS)",id:"nominated-proof-of-stake-npos",level:2},{value:"Nominator",id:"nominator",level:2},{value:"Non-fungible Token (NFT)",id:"non-fungible-token-nft",level:2},{value:"On-chain Governance",id:"on-chain-governance",level:2},{value:"Online Message",id:"online-message",level:2},{value:"Polkadot OpenGov",id:"polkadot-opengov",level:2},{value:"Origin",id:"origin",level:2},{value:"Oversubscribed",id:"oversubscribed",level:2},{value:"Pallet",id:"pallet",level:2},{value:"Parachain",id:"parachain",level:2},{value:"Parachain Development Kit (PDK)",id:"parachain-development-kit-pdk",level:2},{value:"ParaID",id:"paraid",level:2},{value:"Parathread",id:"parathread",level:2},{value:"Parachain Registry",id:"parachain-registry",level:2},{value:"Parity Technologies",id:"parity-technologies",level:2},{value:"Polkadot",id:"polkadot",level:2},{value:"Polkadot Alliance",id:"polkadot-alliance",level:2},{value:"Host",id:"host",level:2},{value:"Runtime Environment",id:"runtime-environment",level:2},{value:"Preimage",id:"preimage",level:2},{value:"Proof of Stake (PoS)",id:"proof-of-stake-pos",level:2},{value:"Proof of Validity",id:"proof-of-validity",level:2},{value:"Proof of Work (PoW)",id:"proof-of-work-pow",level:2},{value:"Proposal",id:"proposal",level:2},{value:"Protocol",id:"protocol",level:2},{value:"Random Seed",id:"random-seed",level:2},{value:"Referendum",id:"referendum",level:2},{value:"Re-Genesis",id:"re-genesis",level:2},{value:"Relay Chain",id:"relay-chain",level:2},{value:"Remarks",id:"remarks",level:2},{value:"Rococo",id:"rococo",level:2},{value:"Root Origin",id:"root-origin",level:2},{value:"Runtime",id:"runtime",level:2},{value:"Runtime Module",id:"runtime-module",level:2},{value:"Safety",id:"safety",level:2},{value:"Scalability",id:"scalability",level:2},{value:"Sealing",id:"sealing",level:2},{value:"Session",id:"session",level:2},{value:"Session Certificate",id:"session-certificate",level:2},{value:"Session Key",id:"session-key",level:2},{value:"Shared Security",id:"shared-security",level:2},{value:"Slashing",id:"slashing",level:2},{value:"Soft Fork",id:"soft-fork",level:2},{value:"Software Development Kit (SDK)",id:"software-development-kit-sdk",level:2},{value:"Staking",id:"staking",level:2},{value:"State transition function",id:"state-transition-function",level:2},{value:"Substrate",id:"substrate",level:2},{value:"System Parachains",id:"system-parachains",level:2},{value:"Tabling",id:"tabling",level:2},{value:"Teleport",id:"teleport",level:2},{value:"Testnet",id:"testnet",level:2},{value:"Tokenization",id:"tokenization",level:2},{value:"Tracks",id:"tracks",level:2},{value:"Tranche",id:"tranche",level:2},{value:"Transfer",id:"transfer",level:2},{value:"Transaction",id:"transaction",level:2},{value:"Validator",id:"validator",level:2},{value:"Vertical Message Passing",id:"vertical-message-passing",level:2},{value:"Voting",id:"voting",level:2},{value:"Waiting Nomination",id:"waiting-nomination",level:2},{value:"Wallet",id:"wallet",level:2},{value:"Wasm",id:"wasm",level:2},{value:"Watermark",id:"watermark",level:2},{value:"Web3 Foundation",id:"web3-foundation",level:2},{value:"WebAssembly",id:"webassembly",level:2},{value:"Weights",id:"weights",level:2},{value:"Witness",id:"witness",level:2},{value:"Whitelist Pallet",id:"whitelist-pallet",level:2}],p={toc:u},m="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,r);return(0,i.kt)(m,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"active-nomination"},"Active Nomination"),(0,i.kt)("p",null,"A validator (or validators) that a nominator has selected to nominate and is actively validating\nthis era. The nominator is placing their stake behind this validator for this era and will\npotentially receive staking rewards in return for doing so."),(0,i.kt)("h2",{id:"alexander"},"Alexander"),(0,i.kt)("p",null,"The fourth (now defunct) proof of concept (PoC-4) ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," for Polkadot."),(0,i.kt)("h2",{id:"asset-hub"},"Asset Hub"),(0,i.kt)("p",null,"A system parachain used for asset management."),(0,i.kt)("h2",{id:"attestation"},"Attestation"),(0,i.kt)("p",null,"In the Polkadot validity system, an\n",(0,i.kt)("em",{parentName:"p"},"attestation")," is a type of message that validators broadcast that says whether they think a\nparachain candidate block is valid or invalid."),(0,i.kt)("h2",{id:"auction-parachain"},"Auction (Parachain)"),(0,i.kt)("p",null,"Parachain auctions are how non-common-good parathreads win a slot to become a parachain."),(0,i.kt)("h2",{id:"aura"},"Aura"),(0,i.kt)("p",null,"Authority-based round-robin scheduling (AURA) provides a slot-based block authoring mechanism, where\na known set of authorities take turns producing blocks."),(0,i.kt)("h2",{id:"authority"},"Authority"),(0,i.kt)("p",null,"An authority is a generic term for the role in a blockchain that can participate in the consensus\nmechanisms. In ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),", the authorities vote on chains they consider\nfinal. In BABE, the authorities are block producers. Authority sets can be chosen to be mechanisms\nsuch as Polkadot's NPoS algorithm."),(0,i.kt)("h2",{id:"availability-cores"},"Availability Cores"),(0,i.kt)("p",null,"Slots used to process parachains. The runtime assigns each parachain to an availability core and\nvalidators can fetch information about the cores, such as parachain block candidates, by calling the\nappropriate Runtime API."),(0,i.kt)("h2",{id:"babe"},"BABE"),(0,i.kt)("p",null,"Blind Assignment for Blockchain Extension (BABE) is\nPolkadot's block production mechanism."),(0,i.kt)("h2",{id:"bitfield-array"},"Bitfield Array"),(0,i.kt)("p",null,"A bitfield array contains single-bit values which indicate whether a ",(0,i.kt)("a",{parentName:"p",href:"#candidate"},"candidate")," is\navailable. The number of items is equal of to the number of\n",(0,i.kt)("a",{parentName:"p",href:"#availability-cores"},"availability cores")," and each bit represents a vote on the corresponding core\nin the given order."),(0,i.kt)("h2",{id:"block"},"Block"),(0,i.kt)("p",null,"A collection of data, such as transactions, that together indicate a state transition of the\nblockchain."),(0,i.kt)("h2",{id:"blockspace"},"Blockspace"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/blockspace-blockspace-ecosystems-how-polkadot-is-unlocking-the-full-potential-of-web3"},"Blockspace"),"\nis the capacity of a blockchain to finalize and commit operations. It represents a blockchain's\nsecurity, computing, and storage capability as an end product. Blockspace produced by different\nblockchains can vary in quality, availability, and flexibility. Polkadot has a\n",(0,i.kt)("a",{parentName:"p",href:"https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/"},"blockspace-centric architecture"),"."),(0,i.kt)("h2",{id:"block-explorer"},"Block Explorer"),(0,i.kt)("p",null,"An application that allows a user to explore the different blocks on a blockchain."),(0,i.kt)("h2",{id:"blocks-nominations"},"Blocks Nominations"),(0,i.kt)("p",null,"This indicates that a validator does not currently allow any more nominations. This is controlled by\nthe validator."),(0,i.kt)("h2",{id:"bls"},"BLS"),(0,i.kt)("p",null,"Boneh-Lynn-Shacham (BLS) signatures have a slow signing, very slow verification, require slow and\nmuch less secure pairing friendly curves, and tend towards dangerous malleability. Yet, BLS permits\na diverse array of signature aggregation options far beyond any other known signature scheme, which\nmakes BLS a preferred scheme for voting in consensus algorithms and threshold signatures."),(0,i.kt)("h2",{id:"bonding"},"Bonding"),(0,i.kt)("p",null,'A process by which tokens can be "frozen" in exchange for some other benefit. For example, staking\nis a form of bonding for which you receive rewards in exchange for securing the network. You can\nalso bond tokens in exchange for a parachain slot.'),(0,i.kt)("h2",{id:"bounty"},"Bounty"),(0,i.kt)("p",null,"A mechanism which works in some sense as the reverse of a Treasury Proposal, allowing the\nPolkadot Council to indicate that there is a\nneed to do some task for the Polkadot network\nand allowing users to receive DOT in return for working on that task."),(0,i.kt)("h2",{id:"bridge"},"Bridge"),(0,i.kt)("p",null,"A parachain that acts as an intermediary between the\nPolkadot Relay Chain and an external chain, in\nsuch a way that it appears to the Relay Chain that the external chain is a parachain (i.e., meets\nthe Polkadot Host's requirements of\nparachains). Bridges allow for interaction between other blockchains, such as Ethereum and Bitcoin,\nthat are not natively compatible with\nPolkadot."),(0,i.kt)("h2",{id:"byzantine-fault-tolerance"},"Byzantine Fault Tolerance"),(0,i.kt)("p",null,"The property of a system that is tolerant of Byzantine faults; a system where not only may\nindividual subsystems fail, but it may not be clear if a particular subsystem has failed or not.\nThat is, different observers on the system may not agree on whether or not the system has failed.\nEnsuring Byzantine fault tolerance is an important part of developing any distributed system."),(0,i.kt)("h2",{id:"capacity"},"Capacity"),(0,i.kt)("p",null,'The maximum number of nominators signalling intent to nominate a validator (and thus could\npotentially actively nominate that validator in the next session). This maximum number will equal\nthe number of nominators necessary to oversubscribe a validator. Any validator which is "at\ncapacity" or higher may potentially be oversubscribed in the next session; a validator that is not\nat capacity cannot be oversubscribed unless more nominators select it before the next election.'),(0,i.kt)("h2",{id:"candidate"},"Candidate"),(0,i.kt)("p",null,"A candidate is a submitted parachain block to the relay chain validators. A parachain block stops\nbeing referred to as a candidate as soon it has been finalized."),(0,i.kt)("h2",{id:"collations"},"Collations"),(0,i.kt)("p",null,"Parachain blocks or candidates that are being proposed to the\nPolkadot relay chain validators. More\nspecifically, a collation is a ",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#defn-collation"},"data structure")," which\ncontains the proposed parachain candidate, including an optional validation parachain Runtime update\nand upward messages."),(0,i.kt)("h2",{id:"collator"},"Collator"),(0,i.kt)("p",null,"A node that maintains a parachain by collecting parachain transactions and producing state\ntransition proofs for the validators."),(0,i.kt)("h2",{id:"collectives"},"Collectives"),(0,i.kt)("p",null,"The Polkadot Collectives parachain was added in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/81"},"Referendum 81")," and exists only on Polkadot (i.e.,\nthere is no Kusama equivalent). The Collectives chain hosts on-chain collectives that serve the\nPolkadot network, such as the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," and ",(0,i.kt)("a",{parentName:"p",href:"#polkadot-alliance"},"Polkadot Alliance"),"."),(0,i.kt)("h2",{id:"commission"},"Commission"),(0,i.kt)("p",null,"Validators and nominators get paid from block production on the network, where validators can set a\nvariable commission rate, which is initially subtracted from the total rewards that validator is\nentitled to (for that period), where the commission determines the rate of distribution for the\nremaining rewards set out for the nominators that are backing that validator."),(0,i.kt)("h2",{id:"common-good-parachain"},"Common Good (Parachain)"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#system-parachains"},"System Parachains"),', which is generally preferred over the term "common\ngood".'),(0,i.kt)("h2",{id:"community-queue"},"Community Queue"),(0,i.kt)("p",null,"The queue for proposals originating from individual accounts (i.e. not the Council) which are\nwaiting to become referenda. Compare the External queue."),(0,i.kt)("h2",{id:"consensus"},"Consensus"),(0,i.kt)("p",null,"The process of a group of entities to agree on a particular data value (such as the ordering and\nmakeup of blocks on a blockchain). There are a variety of algorithms used for determining consensus.\nThe consensus algorithm used by Polkadot is\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"crowdloan"},"Crowdloan"),(0,i.kt)("p",null,"A mechanism for potential parachains to temporarily source tokens to win an auction for a parachain\nslot. Tokens gathered in this way are programmatically returned to the lender after the lease period\nis over or the crowdloan period ends."),(0,i.kt)("h2",{id:"curator"},"Curator"),(0,i.kt)("p",null,"A person, group, or other entity charged with judging and verifying the successful completion of a\nBounty."),(0,i.kt)("h2",{id:"dapps"},"Dapps"),(0,i.kt)("p",null,"A generic term for a decentralized application, that is, one that runs as part of a distributed\nnetwork as opposed to being run on a specific system or set of systems."),(0,i.kt)("h2",{id:"dot"},"DOT"),(0,i.kt)("p",null,'The native token for Polkadot. DOT serves three purposes: network governance (allowing them to vote\non-chain upgrades and other exceptional events), general operation (rewarding good actors and\npunishing bad actors), and bonding (adding new parachains by "freezing" DOT while they are connected\nthe Relay Chain).'),(0,i.kt)("h2",{id:"duty-roster"},"Duty Roster"),(0,i.kt)("p",null,"A lookup table that specifies the job that a particular validator is required to do (i.e. attest to\nthe validity of a specific parachain). The duty roster routinely shuffles the validator set into\ndifferent subsets per parachain."),(0,i.kt)("h2",{id:"epoch"},"Epoch"),(0,i.kt)("p",null,"An epoch is a time duration in the BABE protocol that is broken into smaller time slots. Each slot\nhas at least one slot leader who has the right to propose a block. In Kusama, it is the same\nduration as a ",(0,i.kt)("a",{parentName:"p",href:"#session"},"session"),"."),(0,i.kt)("h2",{id:"era"},"Era"),(0,i.kt)("p",null,"A (whole) number of sessions, which is the period that the validator set (and each validator's\nactive nominator set) is recalculated and where rewards are paid out."),(0,i.kt)("h2",{id:"equivocation"},"Equivocation"),(0,i.kt)("p",null,"Providing conflicting information to the network. BABE equivocation entails creating multiple blocks\nin the same slot. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," equivocation would consist of signing multiple\nconflicting chains."),(0,i.kt)("h2",{id:"external-queue"},"External Queue"),(0,i.kt)("p",null,"The queue for proposals originating with the\nPolkadot Council which are waiting to become\nreferenda. Compare the Community queue."),(0,i.kt)("h2",{id:"extrinsic"},"Extrinsic"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE encoded"),' array consisting of a version\nnumber, signature, and varying data types indicating the resulting runtime function to be called,\nincluding the parameters required for that function to be executed. These state changes are invoked\nfrom the outside world, i.e. they are not part of the system itself. Extrinsics can take two forms,\n"',(0,i.kt)("a",{parentName:"p",href:"#inherent"},"inherents"),'" and "',(0,i.kt)("a",{parentName:"p",href:"#transaction"},"transactions"),'". For more technical details see the\n',(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#id-extrinsics"},"polkadot spec")),(0,i.kt)("h2",{id:"fellowship"},"Fellowship"),(0,i.kt)("p",null,"A mostly self-governing expert body with a primary goal of representing humans who embody and\ncontain the technical knowledge base of the Kusama and/or Polkadot networks and protocols."),(0,i.kt)("h2",{id:"finality"},"Finality"),(0,i.kt)("p",null,'The property of a block that cannot be reverted. Generally, created blocks are not final until some\npoint in the future - perhaps never, in the case of "probabilistic finality". The\nPolkadot Relay Chain uses a deterministic\nfinality gadget known as ',(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"finality-gadget"},"Finality Gadget"),(0,i.kt)("p",null,"A mechanism that determines finality."),(0,i.kt)("h2",{id:"frame"},"Frame"),(0,i.kt)("p",null,"The collection of Substrate-provided pallets (Substrate Runtime Modules)."),(0,i.kt)("h2",{id:"genesis"},"Genesis"),(0,i.kt)("p",null,"The origin of a blockchain, also known as block 0. It can also be used to reference the initial\nstate of the blockchain at origination."),(0,i.kt)("admonition",{title:"Example",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"In the ",(0,i.kt)("em",{parentName:"p"},"genesis")," state Alice, Bob, and Charlie had 30 tokens each.")),(0,i.kt)("h2",{id:"governance"},"Governance"),(0,i.kt)("p",null,"The process of determining what changes to the network are permissible, such as modifications to\ncode or movement of funds. The governance system in\nPolkadot is on-chain and revolves around\nstakeholder voting."),(0,i.kt)("h2",{id:"governance-council"},"Governance Council"),(0,i.kt)("p",null,'An on-chain entity that consists of several on-chain accounts (starting at 6, eventually moving to\nthe final value of 24). The Council can act as a representative for "passive" (non-voting)\nstakeholders. Council members have two main tasks: proposing referenda for the overall stakeholder\ngroup to vote on and cancelling malicious referenda.'),(0,i.kt)("h2",{id:"grandpa-finality-gadget"},"GRANDPA Finality Gadget"),(0,i.kt)("p",null,"GHOST-based Recursive ANcestor Deriving Prefix Agreement. It is the finality gadget for\nPolkadot, which allows asynchronous,\naccountable, and safe finality to the blockchain. For an overview of GRANDPA, see\n",(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/polkadot-proof-of-concept-3-a-better-consensus-algorithm-e81c380a2372"},"this Medium post")),(0,i.kt)("h2",{id:"hard-fork"},"Hard Fork"),(0,i.kt)("p",null,"A permanent diversion of a blockchain occurs quickly due to a high priority change in a consensus\nrule. Clients who follow a hard fork always need to upgrade their clients to continue following the\nupgraded chain. Hard forks are considered permanent divergences of a chain for which non-upgraded\nclients are following consensus rules incompatible to the ones followed by upgraded clients."),(0,i.kt)("h2",{id:"hard-spoon"},"Hard Spoon"),(0,i.kt)("p",null,'Defined by Jae Kwon of Cosmos as "a new chain that takes into account state from an existing chain;\nnot to compete, but to provide broad access." A non-contentious blockchain that inherits the state\nof the underlying blockchain and creates a new branch of ',(0,i.kt)("em",{parentName:"p"},"the same blockchain"),"."),(0,i.kt)("h2",{id:"horizontal-relay-routed-message-passing"},"Horizontal Relay-routed Message Passing"),(0,i.kt)("p",null,"Horizontal Relay-routed Message Passing, also known as HRMP, is a precursor to the complete XCMP\nimplementation, that mimics the same interface and semantics of XCMP. It is similar to XCMP except\nfor how it stores all messages in the Relay Chain storage, therefore making it more expensive and\ndemanding more resources than XCMP. The plan is to retire HRMP once the implementation of XCMP is\ncomplete."),(0,i.kt)("h2",{id:"inactive-nomination"},"Inactive Nomination"),(0,i.kt)("p",null,"A validator (or validators) that a nominator has selected to nominate, but is not actively\nvalidating this era. This type of nomination may become active in a future era."),(0,i.kt)("h2",{id:"inherent"},"Inherent"),(0,i.kt)("p",null,'Extrinsics that are "inherently true." Inherents are not gossiped on the network and are put into\nblocks by the block author. They are not provably true the way that the desire to send funds is,\ntherefore they do not carry a signature. A blockchain\'s ',(0,i.kt)("a",{parentName:"p",href:"#runtime"},"runtime")," must have rules for\nvalidating inherents. For example, timestamps are inherents. They are validated by being within some\nmargin that each validator deems reasonable."),(0,i.kt)("h2",{id:"injected-account"},"Injected Account"),(0,i.kt)("p",null,"An account that is not directly managed by the Polkadot UI but can be accessed through it, such as\naccounts controlled by the Polkadot{.js} extension."),(0,i.kt)("h2",{id:"interoperability"},"Interoperability"),(0,i.kt)("p",null,'The ability for some sort of system to exchange and make use of information often compared to\n"cross-chain" technologies.'),(0,i.kt)("h2",{id:"keep-alive-check"},"Keep-Alive Check"),(0,i.kt)("p",null,"The keep-alive check is used to indicate whether or not a transfer can allow the sending account to\nbe reduced to less than the existential deposit, causing it to be reaped."),(0,i.kt)("h2",{id:"ksm"},"KSM"),(0,i.kt)("p",null,"The abbreviation for Kusama network tokens."),(0,i.kt)("h2",{id:"kusama"},"Kusama"),(0,i.kt)("p",null,'The "canary network" for Polkadot. It consists of an early-release, unaudited version of the\nPolkadot software. It is ',(0,i.kt)("strong",{parentName:"p"},"not")," a ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," - after the transition to NPoS, the network\nis entirely in the hands of the community (i.e., Kusama token holders)."),(0,i.kt)("h2",{id:"lease-period"},"Lease Period"),(0,i.kt)("p",null,"A particular amount of time that a parachain for which the parachain can connect to the Relay Chain."),(0,i.kt)("h2",{id:"libp2p"},"LIBP2P"),(0,i.kt)("p",null,"An open-source library for encrypted peer-to-peer communications and other networking functions.\nMore information at: ",(0,i.kt)("a",{parentName:"p",href:"https://libp2p.io/"},"https://libp2p.io/")),(0,i.kt)("h2",{id:"liveness"},"Liveness"),(0,i.kt)("p",null,"The property of a distributed system is that it will eventually come to some sort of consensus. A\nsystem stuck in an infinite loop would not be considered live, even if computations are taking\nplace; a system that eventually provides a result, even if incorrect or it takes a long time, is\nconsidered to have liveness."),(0,i.kt)("h2",{id:"mainnet"},"Mainnet"),(0,i.kt)("p",null,'Short for "main network": the fully functional and acting chain that runs its own network.'),(0,i.kt)("h2",{id:"message"},"Message"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message")," is\narbitrary data that is sent from one parachain (the egress chain) to another (the ingress chain)\nthrough a channel and ensured delivery by the validator set."),(0,i.kt)("h2",{id:"message-queue"},"Message Queue"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message queue"),"\nis the list of messages waiting to be processed by a particular receiving parachain over a channel."),(0,i.kt)("h2",{id:"metadata"},"Metadata"),(0,i.kt)("p",null,"Data that includes information about other data, such as information about a specific transaction."),(0,i.kt)("h2",{id:"motion"},"Motion"),(0,i.kt)("p",null,'A motion is essentially a "referendum" or "decision" being considered by the Council. The Council\ncan vote on motions like approving Treasury Proposals or making proposals for the community to vote\non.'),(0,i.kt)("h2",{id:"next-session"},"Next Session"),(0,i.kt)("p",null,"This indicates that the validator will be a member of the active set in the next session."),(0,i.kt)("h2",{id:"node-explorer"},"Node Explorer"),(0,i.kt)("p",null,"A tool that gives you information about a node, such as the latest blocks sealed, finalized, and the\ncurrent chain state as known by that node."),(0,i.kt)("h2",{id:"nominated-proof-of-stake-npos"},"Nominated Proof of Stake (NPoS)"),(0,i.kt)("p",null,"A Proof-of-Stake system where nominators back validators with their own stake as a show of faith in\nthe good behavior of the validator. Nominated Proof-of-Stake differs from the more generic concept\nDelegated Proof-of-Stake in that nominators are subject to loss of stake if they nominate a bad\nvalidator; delegators are not subject to loss of stake based on the behavior of the validator. Note\nthat some other blockchain technologies may use the term Delegated Proof-of-Stake, even if\ndelegators can be slashed. Polkadot uses the\nPhragm\xe9n method to allocate stake to nominees."),(0,i.kt)("h2",{id:"nominator"},"Nominator"),(0,i.kt)("p",null,"Accounts that select a set of validators to nominate by bonding their tokens. Nominators receive\nsome of the validators' rewards, but are also liable for slashing if their nominated validators\nmisbehave."),(0,i.kt)("h2",{id:"non-fungible-token-nft"},"Non-fungible Token (NFT)"),(0,i.kt)("p",null,"A non-fungible token is a token that does not hold the property of fungibility, which, in turn,\nmeans that it cannot be interchangeable and indistinguishable from other tokens. NFTs allow the\ntokenization of unique items and provide exclusive ownership for those tokens."),(0,i.kt)("h2",{id:"on-chain-governance"},"On-chain Governance"),(0,i.kt)("p",null,"A governance system of a blockchain that is controlled by mechanisms on the blockchain. On-chain\ngovernance allows decisions to be made transparently. Note that there are a variety of different\nalgorithms for making these decisions, such as simple majority voting, adaptive quorum biasing, or\nidentity-based quadratic voting."),(0,i.kt)("h2",{id:"online-message"},"Online Message"),(0,i.kt)("p",null,'This is a message that is broadcast by a validator to verify to the network that the validator is\nonline, even if they haven\'t published a block this epoch. This is sometimes referred to as\n"ImOnline".'),(0,i.kt)("h2",{id:"polkadot-opengov"},"Polkadot OpenGov"),(0,i.kt)("p",null,"Previously known as Governance v2 (Gov2) during early development,\n",(0,i.kt)("a",{parentName:"p",href:"../learn/learn-polkadot-opengov"},"Polkadot OpenGov")," serves as the current governance protocol for\nboth Kusama and Polkadot."),(0,i.kt)("h2",{id:"origin"},"Origin"),(0,i.kt)("p",null,"The initiator of an extrinsic. A simple origin would be the account that is sending a token to\nanother account. Polkadot also supports more\ncomplex origin types, such as the ",(0,i.kt)("a",{parentName:"p",href:"#root-origin"},"root origin"),", from which privileged functions can\nbe called."),(0,i.kt)("h2",{id:"oversubscribed"},"Oversubscribed"),(0,i.kt)("p",null,'If more than the maximum number of nominators nominate the same validator, it is "oversubscribed",\nand only the top staked nominators (ranked by the amount of stake, up to the maximum number of\nnominators) are paid rewards. Other nominators will receive no rewards for that era. The current\nmaximum number of nominators is\n',(0,i.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"})," on Polkadot,\n","\nbut it can be modified via governance."),(0,i.kt)("h2",{id:"pallet"},"Pallet"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"#substrate"},"Substrate")," runtime module."),(0,i.kt)("h2",{id:"parachain"},"Parachain"),(0,i.kt)("p",null,'A blockchain that meets several characteristics that allow it to work within the confines of the\nPolkadot Host. Also known as "parallelized\nchain."'),(0,i.kt)("h2",{id:"parachain-development-kit-pdk"},"Parachain Development Kit (PDK)"),(0,i.kt)("p",null,"Similar to an ",(0,i.kt)("a",{parentName:"p",href:"#sdk"},"SDK"),", parachain development kits (PDK) is a set of tools that make it easy for\ndevelopers to create Polkadot compatible\n",(0,i.kt)("a",{parentName:"p",href:"#parachain"},"parachains"),"."),(0,i.kt)("h2",{id:"paraid"},"ParaID"),(0,i.kt)("p",null,"A unique numeric (non-negative integer) identifier for a parathread."),(0,i.kt)("h2",{id:"parathread"},"Parathread"),(0,i.kt)("p",null,'A blockchain that works within the confines of the\nPolkadot Host, thus allowing it to connect to\nthe Polkadot Relay Chain. This can be done either by becoming a parachain or connecting on a "pay as\nyou go" basis. All parachains start their life-cycle as a parathread.'),(0,i.kt)("h2",{id:"parachain-registry"},"Parachain Registry"),(0,i.kt)("p",null,"A relatively simple database-like construct that holds both static and dynamic information on each\nchain."),(0,i.kt)("h2",{id:"parity-technologies"},"Parity Technologies"),(0,i.kt)("p",null,"A company, founded by Dr. Gavin Wood and Dr. Jutta Steiner, that is developing Substrate, Kusama and\nPolkadot. It has also released several other projects including Parity Ethereum and Parity Secret\nStore."),(0,i.kt)("h2",{id:"polkadot"},"Polkadot"),(0,i.kt)("p",null,"A heterogeneous, multi-chain network allowing various blockchains of different characteristics to\nperform arbitrary, cross-chain communication under shared security."),(0,i.kt)("h2",{id:"polkadot-alliance"},"Polkadot Alliance"),(0,i.kt)("p",null,"The Polkadot Alliance is an ",(0,i.kt)("a",{parentName:"p",href:"#collectives"},"on-chain collective")," founded by Acala, Astar, Interlay,\nKilt, Moonbeam, Phala, and Subscan, to establish standards and ethics for open-source development in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/94"},"referendum #94"),". It aims to support development\nstandards and expose bad actors within the ecosystems of Polkadot."),(0,i.kt)("h2",{id:"host"},"Host"),(0,i.kt)("p",null,"The environment in which a runtime module can be executed. Parachains must support the\nPolkadot Host - external chains that do not\nwill have to use a bridge. Previously known as the\nPolkadot Runtime Environment."),(0,i.kt)("h2",{id:"runtime-environment"},"Runtime Environment"),(0,i.kt)("p",null,"The previous name for the Polkadot\n",(0,i.kt)("a",{parentName:"p",href:"#polkadot-host"},"Host"),"."),(0,i.kt)("h2",{id:"preimage"},"Preimage"),(0,i.kt)("p",null,"The on-chain proposals do not require the entire image of extrinsics and data (for instance the WASM\ncode, in case of upgrades) to be submitted, but would rather just need that image's hash. That\n",(0,i.kt)("strong",{parentName:"p"},"preimage")," can be submitted and stored on-chain against the hash later, upon the proposal's\ndispatch."),(0,i.kt)("h2",{id:"proof-of-stake-pos"},"Proof of Stake (PoS)"),(0,i.kt)("p",null,"A method of selecting participation in a consensus system, in which participants are chosen based on\nhow many tokens they have at stake (at risk of loss due to misbehavior). Normally, Proof-of-Stake\nsystems limit the number of participants."),(0,i.kt)("h2",{id:"proof-of-validity"},"Proof of Validity"),(0,i.kt)("p",null,"A proof produced by parachain collators. Based on this proof and the parachain registry, a validator\ncan verify that a parachain has properly executed its state transition function. Proofs of Validity\ngo into the Relay Chain blocks."),(0,i.kt)("h2",{id:"proof-of-work-pow"},"Proof of Work (PoW)"),(0,i.kt)("p",null,"A method of selecting participants in a consensus system, typically the longest chain rule, in which\nparticipants try to solve a puzzle like finding a partial pre-image of a hash. Normally, a\nProof-of-Work system can have any number of participants."),(0,i.kt)("h2",{id:"proposal"},"Proposal"),(0,i.kt)("p",null,"A potential function call to be voted on in a referendum. Proposals modify the behavior of the\nPolkadot network, from minor parameter tuning\nup to replacing the runtime code."),(0,i.kt)("h2",{id:"protocol"},"Protocol"),(0,i.kt)("p",null,"A system of rules that allows two or more entities of a communications system to transmit\ninformation. The protocol defines the rules, syntax, semantics, and synchronization of communication\nand possible recovery methods."),(0,i.kt)("h2",{id:"random-seed"},"Random Seed"),(0,i.kt)("p",null,"A random seed is a pseudo-random number available on-chain. It is used in various places of the\nPolkadot protocol, most prominently in\n",(0,i.kt)("a",{parentName:"p",href:"#babe"},"BABE")," the block production mechanism."),(0,i.kt)("h2",{id:"referendum"},"Referendum"),(0,i.kt)("p",null,"A vote on whether or not a proposal should be accepted by the network. Referenda may be initiated by\nthe Governance Council, by a member of the public, or as the result of a previous proposal.\nStakeholders vote on referenda, weighted by both the size of their stake (i.e. number of DOT held)\nand the amount of time they are willing to lock their tokens."),(0,i.kt)("h2",{id:"re-genesis"},"Re-Genesis"),(0,i.kt)("p",null,"Re-Genesis is the process of exporting the current chain state, and creating a new chain that builds\non it. Re-Genesis will involve stop-the-world migration, which results in a period of time when no\nactual blocks are added to the blockchain. In a way, re-genesis can be viewed as a hard fork\nprocess. A formal design of Re-Genesis on Substrate is still under development -\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/issues/7458"},"Re-Genesis Rationale and Design"),"."),(0,i.kt)("h2",{id:"relay-chain"},"Relay Chain"),(0,i.kt)("p",null,"The chain that coordinates consensus and communication between parachains (and external chains, via\nbridges)."),(0,i.kt)("h2",{id:"remarks"},"Remarks"),(0,i.kt)("p",null,"Remarks are extrinsics with no effect. They provide additional information to external inputs,\nacting as ",(0,i.kt)("em",{parentName:"p"},"notes"),". Remarks are stored alongside block records and do not change the chain's storage;\nthe information is not stored in the chain's trie, but along blocks."),(0,i.kt)("h2",{id:"rococo"},"Rococo"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," set aside for testing parachains, cumulus, and related technology."),(0,i.kt)("h2",{id:"root-origin"},"Root Origin"),(0,i.kt)("p",null,"A system-level origin in ",(0,i.kt)("a",{parentName:"p",href:"#Substrate"},"Substrate"),". This is the highest privilege level and can be\nthought of as the superuser of the runtime origin. To learn about more raw origins in Substrate,\nvisit ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/origins/"},"Substrate Docs")),(0,i.kt)("h2",{id:"runtime"},"Runtime"),(0,i.kt)("p",null,"The state transition function of a blockchain. It defines a valid algorithm for determining the\nstate of the next block given the previous state."),(0,i.kt)("h2",{id:"runtime-module"},"Runtime Module"),(0,i.kt)("p",null,'A module that implements specific transition functions and features one might want to have in their\nruntime. Each module should have domain-specific logic. For example, a Balances module has logic to\ndeal with accounts and balances. In Substrate, modules are called "pallets".'),(0,i.kt)("h2",{id:"safety"},"Safety"),(0,i.kt)("p",null,"The property of a distributed system indicating that a particular state transition will not be\nreverted. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," provides ",(0,i.kt)("em",{parentName:"p"},"deterministic"),' safety. That is, for a state\nchanged marked as "safe" or "final", one would require a hard fork to revert that change.'),(0,i.kt)("h2",{id:"scalability"},"Scalability"),(0,i.kt)("p",null,"While an ambiguous concept, ","[blockchain]"," scalability can be understood as the ability for the\nnetwork to scale in capabilities (e.g. processing more transactions) when needed."),(0,i.kt)("h2",{id:"sealing"},"Sealing"),(0,i.kt)("p",null,"The process of adding a block to the Relay Chain. Note that finalization is a separate process -\nblocks are finalized sometime after they are sealed."),(0,i.kt)("h2",{id:"session"},"Session"),(0,i.kt)("p",null,"A session is a Substrate implementation term for a period that has a constant set of validators.\nValidators can only join or exit the validator set at a session change."),(0,i.kt)("h2",{id:"session-certificate"},"Session Certificate"),(0,i.kt)("p",null,"A message containing a signature on the concatenation of all the Session keys."),(0,i.kt)("h2",{id:"session-key"},"Session Key"),(0,i.kt)("p",null,"Hot keys that are used for performing network operations by validators, for example, signing\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," commit messages."),(0,i.kt)("h2",{id:"shared-security"},"Shared Security"),(0,i.kt)("p",null,"The security model that Polkadot uses whereby\nall chains are equally secured. This is achieved by placing proofs of the validity of parachain\nblocks into the Relay Chain such that, in order to revert finality of a single parachain, an\nattacker would need to attack the entire\nPolkadot system."),(0,i.kt)("h2",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"The removal of a percentage of an account's DOT as a punishment for a validator acting maliciously\nor incompetently (e.g., equivocating or remaining offline for an extended period)."),(0,i.kt)("h2",{id:"soft-fork"},"Soft Fork"),(0,i.kt)("p",null,'A backward compatible change to client code causes upgraded clients to start mining a new chain.\nRequires a "vote-by-hashrate" of a majority of miners to enact successfully. Soft forks are\nconsidered temporary divergences in a chain since non-upgraded clients do not follow the new\nconsensus rules but upgraded clients are still compatible with old consensus rules.'),(0,i.kt)("h2",{id:"software-development-kit-sdk"},"Software Development Kit (SDK)"),(0,i.kt)("p",null,"A collection of software tools (and programs) packaged together that can be used to develop\nsoftware."),(0,i.kt)("h2",{id:"staking"},"Staking"),(0,i.kt)("p",null,'The act of bonding tokens for Polkadot (DOT)\nby putting them up as "collateral" for a chance to produce a\nvalid block (and thus obtain a block reward). Validators and nominators stake their\nDOT in order to secure the network.'),(0,i.kt)("h2",{id:"state-transition-function"},"State transition function"),(0,i.kt)("p",null,"A function that describes how the state of a blockchain can be transformed. For example, it may\ndescribe how tokens can be transferred from one account to another."),(0,i.kt)("h2",{id:"substrate"},"Substrate"),(0,i.kt)("p",null,"A modular framework for building blockchains.\nPolkadot is built using\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.io/"},"Substrate"),". Chains built with Substrate will be easy to connect as\nparachains. For developers, see the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate"},"Substrate GitHub repository"),"."),(0,i.kt)("h2",{id:"system-parachains"},"System Parachains"),(0,i.kt)("p",null,"Parachains that are part of the Polkadot core protocol. These are allocated a parachain execution\ncore by governance rather than auction."),(0,i.kt)("h2",{id:"tabling"},"Tabling"),(0,i.kt)("p",null,'In Polkadot governance, bringing a proposal to\na vote via referendum. Note that this is the British meaning of "tabling", which is different from\nthe US version, which means "to postpone" a measure.'),(0,i.kt)("h2",{id:"teleport"},"Teleport"),(0,i.kt)("p",null,"Send an asset from an account on one chain to an account on a different chain. This occurs by\nburning an amount on the sending chain and minting an equivalent amount on the destination chain."),(0,i.kt)("h2",{id:"testnet"},"Testnet"),(0,i.kt)("p",null,'Short for "test network": an experimental network where testing and development takes place.\nNetworks are often executed on a testnet before they are deployed to a ',(0,i.kt)("a",{parentName:"p",href:"#mainnet"},"mainnet"),"."),(0,i.kt)("h2",{id:"tokenization"},"Tokenization"),(0,i.kt)("p",null,"The process of replacing sensitive data with non-sensitive data."),(0,i.kt)("h2",{id:"tracks"},"Tracks"),(0,i.kt)("p",null,"Each ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin")," is associated with a single referendum class and each class is associated\nwith a ",(0,i.kt)("a",{parentName:"p",href:"../maintain/maintain-guides-polkadot-opengov#origins-and-tracks"},"Track"),". The Track outlines\nthe lifecycle for the proposal and is independent from other class's tracks. Having independent\ntracks allows the network to tailor the dynamics of referenda based upon their implied privilege\nlevel."),(0,i.kt)("h2",{id:"tranche"},"Tranche"),(0,i.kt)("p",null,"Validators use a subjective, tick-based system to determine when the approval process should start.\nA validator starts the tick-based system when a new availability core candidates have been proposed,\nwhich can be retrieved via the\n",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-rt-api-availability-cores"},"Runtime API"),", and increments the\ntick every 500 milliseconds. Each tick/increment is referred to as a \u201ctranche\u201d, represented as an\ninteger, starting at 0."),(0,i.kt)("h2",{id:"transfer"},"Transfer"),(0,i.kt)("p",null,"Send an asset from one account to another. This generally refers to transfers that occur only on the\nsame chain."),(0,i.kt)("h2",{id:"transaction"},"Transaction"),(0,i.kt)("p",null,'An extrinsic that is signed. Transactions are gossiped on the network and incur a transaction fee.\nTransactions are "provably true", unlike inherents. For example, one can prove that Alice wants to\nsend funds to Bob by the fact that she signed a transfer-funds message with her private key.'),(0,i.kt)("h2",{id:"validator"},"Validator"),(0,i.kt)("p",null,"A node that secures the Relay Chain by staking DOT, validating proofs from collators on parachains\nand voting on consensus along with other validators."),(0,i.kt)("h2",{id:"vertical-message-passing"},"Vertical Message Passing"),(0,i.kt)("p",null,"Vertical message passing consists of two separate types of message passing, Downward Message Passing\n(DMP) and Upward Message Passing (UMP). Downward messages pass from the Relay Chain to a parachain,\nalthough they may also originate from another parachain via\n",(0,i.kt)("a",{parentName:"p",href:"#Horizontal-Relay-routed-Message-Passing"},"HRMP"),". Upward messages originate from parachains and go\nup to the Relay Chain via runtime entry points."),(0,i.kt)("h2",{id:"voting"},"Voting"),(0,i.kt)("p",null,"The process of stakeholders determining whether or not a referendum should pass. Votes are weighted\nboth by the number of DOT that the stakeholder account controls and the amount of time they are\nwilling to lock their DOT."),(0,i.kt)("h2",{id:"waiting-nomination"},"Waiting Nomination"),(0,i.kt)("p",null,"The nominator has nominated this validator, but the validator was not elected into the active\nvalidator set this era and thus cannot produce blocks for the canonical chain. If the validator does\nget into the active set in a future era, this may turn into an active or inactive nomination."),(0,i.kt)("h2",{id:"wallet"},"Wallet"),(0,i.kt)("p",null,"A program that allows one to store private keys and sign transactions for\nPolkadot or other blockchain networks."),(0,i.kt)("h2",{id:"wasm"},"Wasm"),(0,i.kt)("p",null,"The abbreviation for ",(0,i.kt)("a",{parentName:"p",href:"#webassembly"},"WebAssembly"),"."),(0,i.kt)("h2",{id:"watermark"},"Watermark"),(0,i.kt)("p",null,"In Polkadot's parachain messaging scheme, the ",(0,i.kt)("em",{parentName:"p"},"watermark")," is the minimum processed send-height of\nthe receiving parachain. All messages on all channels that are sending to this parachain at or\nbefore the watermark are guaranteed to be processed."),(0,i.kt)("h2",{id:"web3-foundation"},"Web3 Foundation"),(0,i.kt)("p",null,"A Switzerland-based foundation that nurtures and stewards technologies and applications in the\nfields of decentralized web software protocols, particularly those that utilize modern cryptographic\nmethods to safeguard decentralization, to the benefit and for the stability of the Web3 ecosystem."),(0,i.kt)("h2",{id:"webassembly"},"WebAssembly"),(0,i.kt)("p",null,"An instruction format for a virtual, stack-based machine.\nPolkadot Runtime Modules are compiled to\nWebAssembly. Also known as Wasm."),(0,i.kt)("h2",{id:"weights"},"Weights"),(0,i.kt)("p",null,"A permission-less system needs to implement a mechanism to measure and limit usage in order to\nestablish an economic incentive structure, to prevent the network overload, and to mitigate DoS\nvulnerabilities. This mechanism must enforce a limited time-window for block producers to create a\nblock and include limitations on block size, to prevent execution of certain extrinsics which are\ndeemed too expensive and could decelerate the network. This is handled by the weight system, where\nthe cost of the transactions (referred to as ",(0,i.kt)("a",{parentName:"p",href:"#extrinsic"},"extrinsics"),") are determined before\nexecution. Checkout this section of the Substrate docs covering\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/build/tx-weights-fees/"},"transaction weights and fees"),"."),(0,i.kt)("h2",{id:"witness"},"Witness"),(0,i.kt)("p",null,"Cryptographic proof statements of data validity."),(0,i.kt)("h2",{id:"whitelist-pallet"},"Whitelist Pallet"),(0,i.kt)("p",null,"Allows one ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin ")," to escalate the privilege level of another Origin for a certain\noperation. In terms of OpenGov, it allows the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," to authorise a new origin\n(which we will call Whitelisted-Root) to be executed with Root-level privileges."))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/a74a59a0.123441bd.js b/assets/js/a74a59a0.123441bd.js deleted file mode 100644 index 8babdb9d7348..000000000000 --- a/assets/js/a74a59a0.123441bd.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[8702],{12418:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(34200),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,d,p,u,c,h,m,k;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i=new r.U(a),e.next=3,s.G.create({provider:i});case 3:return d=e.sent,e.next=6,Promise.all([d.query.session.validators(),d.query.staking.currentEra()]);case 6:return p=e.sent,u=p[0],c=p[1],e.next=11,d.query.staking.erasStakers(c.toString(),u[0]);case 11:return h=e.sent,m=parseInt(h.total),e.next=15,d.query.staking.erasStakers.entries(c.toString());case 15:e.sent.forEach((function(e){e[0];var t=e[1],a=parseInt(t.total);a{"use strict";a.d(t,{Z:()=>c});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(34200),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:p=e.sent,(u=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,p=(0,i.useState)(""),c=p[0],h=p[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?u(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},11300:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>g,frontMatter:()=>d,metadata:()=>u,toc:()=>h});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=a(12418),l=["components"],d={id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},p=void 0,u={unversionedId:"maintain/maintain-guides-how-to-validate-polkadot",id:"maintain/maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",description:"The fundamentals for running a Polkadot validator.",source:"@site/../docs/maintain/maintain-guides-how-to-validate-polkadot.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-validate-polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-validate-polkadot.md",tags:[],version:"current",lastUpdatedBy:"Dominique",lastUpdatedAt:1694979058,formattedLastUpdatedAt:"Sep 17, 2023",frontMatter:{id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},sidebar:"docs",previous:{title:"Nominator Guides",permalink:"/docs/maintain-guides-how-to-nominate-polkadot"},next:{title:"Validator Payout Overview",permalink:"/docs/maintain-guides-validator-payout"}},c={},h=[{value:"Preliminaries",id:"preliminaries",level:2},{value:"How many DOT do I need to become an active Validator?",id:"how-many-dot-do-i-need-to-become-an-active-validator",level:3},{value:"Initial Set-up",id:"initial-set-up",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Reference Hardware",id:"standard-hardware",level:4},{value:"Install & Configure Network Time Protocol (NTP) Client",id:"install--configure-network-time-protocol-ntp-client",level:3},{value:"Make Sure Landlock is Enabled",id:"make-sure-landlock-is-enabled",level:3},{value:"Installing the Polkadot binaries",id:"installing-the-polkadot-binaries",level:3},{value:"Installation from official releases",id:"installation-from-official-releases",level:4},{value:"Optional: Installation with Package Managers",id:"optional-installation-with-package-managers",level:4},{value:"Debian-based (Debian, Ubuntu)",id:"debian-based-debian-ubuntu",level:4},{value:"RPM-based (Fedora, CentOS)",id:"rpm-based-fedora-centos",level:4},{value:"Optional: Installation with Ansible",id:"optional-installation-with-ansible",level:4},{value:"Optional: Installation with Docker",id:"optional-installation-with-docker",level:4},{value:"Optional: Building the Polkadot binaries from sources",id:"optional-building-the-polkadot-binaries-from-sources",level:3},{value:"Prerequisites: Install Rust and Dependencies",id:"prerequisites-install-rust-and-dependencies",level:4},{value:"Building the binaries",id:"building-the-binaries",level:4},{value:"Verify the installation",id:"verify-the-installation",level:3},{value:"Synchronize Chain Data",id:"synchronize-chain-data",level:3},{value:"Database Snapshot Services",id:"database-snapshot-services",level:4},{value:"Bond DOT",id:"bond-dot",level:2},{value:"Set Session Keys",id:"set-session-keys",level:2},{value:"Generating the Session Keys",id:"generating-the-session-keys",level:3},{value:"Option 1: PolkadotJS-APPS",id:"option-1-polkadotjs-apps",level:4},{value:"Option 2: CLI",id:"option-2-cli",level:4},{value:"Submitting the setKeys Transaction",id:"submitting-the-setkeys-transaction",level:3},{value:"Validate",id:"validate",level:2},{value:"Setup via Validator Tab",id:"setup-via-validator-tab",level:3},{value:"Thousand Validators Programme",id:"thousand-validators-programme",level:2},{value:"Running a validator on a testnet",id:"running-a-validator-on-a-testnet",level:2},{value:"FAQ",id:"faq",level:2},{value:"Why am I unable to synchronize the chain with 0 peers?",id:"why-am-i-unable-to-synchronize-the-chain-with-0-peers",level:3},{value:"How do I clear all my chain data?",id:"how-do-i-clear-all-my-chain-data",level:3},{value:"Note about VPS",id:"note-about-vps",level:2},{value:"Disable SMT",id:"disable-smt",level:3},{value:"Disable automatic NUMA balancing",id:"disable-automatic-numa-balancing",level:3},{value:"Configure Spectre/Meltdown Mitigations",id:"configure-spectremeltdown-mitigations",level:3},{value:"For Linux >= 5.16",id:"for-linux--516",level:4},{value:"For Linux < 5.16",id:"for-linux--516-1",level:4},{value:"VPS List",id:"vps-list",level:3}],m={toc:h},k="wrapper";function g(e){var t=e.components,d=(0,o.Z)(e,l);return(0,i.kt)(k,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"If you are a beginner, it is recommended that you start your validator journey on Kusama network.\nCheck the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"Kusama guide")," for details on how to get\nstarted.")),(0,i.kt)("h2",{id:"preliminaries"},"Preliminaries"),(0,i.kt)("p",null,"Running a validator on a live network is a lot of responsibility! You will be accountable for not\nonly your own stake, but also the stake of your current nominators. If you make a mistake and get\nslashed, your tokens and your reputation will be at risk. However, running a validator can also be\nvery rewarding, knowing that you contribute to the security of a decentralized network while growing\nyour stash."),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"It is highly recommended that you have significant system administration experience before\nattempting to run your own validator."),(0,i.kt)("p",{parentName:"admonition"},"You must be able to handle technical issues and anomalies with your node which you must be able to\ntackle yourself. Being a validator involves more than just executing the Polkadot binary.")),(0,i.kt)("p",null,"Since security is so important to running a successful validator, you should take a look at the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator")," information to make sure you understand the\nfactors to consider when constructing your infrastructure. As you progress in your journey as a\nvalidator, you will likely want to use this repository as a ",(0,i.kt)("em",{parentName:"p"},"starting point")," for your own\nmodifications and customizations."),(0,i.kt)("p",null,"If you need help, please reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/#polkadotvalidatorlounge:web3.foundation"},"Polkadot Validator Lounge")," on\nElement. The team and other validators are there to help answer questions and provide tips from\nexperience."),(0,i.kt)("h3",{id:"how-many-dot-do-i-need-to-become-an-active-validator"},"How many DOT do I need to become an active Validator?"),(0,i.kt)("p",null,"You can have a rough estimate on that by using the methods listed\n",(0,i.kt)("a",{parentName:"p",href:"/docs/faq/#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),".\nTo be elected into the set, you need a minimum stake behind your validator. This stake can come from\nyourself or from ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominators"),". This means that as a minimum, you will\nneed enough DOT to set up stash and staking proxy ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"accounts")," with\nthe existential deposit, plus a little extra for transaction fees. The rest can come from\nnominators. To understand how validators are elected, check the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS Election algorithms")," page."),(0,i.kt)("admonition",{title:"On-Chain Data for Reference",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"On Polkadot, the minimum stake backing a validator in the active set is\n",(0,i.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n",""),(0,i.kt)("p",{parentName:"admonition"},"On Kusama, the minimum stake backing a validator in the active set is\n","\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,i.kt)(r.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),".")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Warning:")," Any DOT that you stake for your validator is liable to be slashed, meaning that an\ninsecure or improper setup may result in loss of DOT tokens! If you are not confident in your\nability to run a validator node, it is recommended to nominate your DOT to a trusted validator node\ninstead."),(0,i.kt)("h2",{id:"initial-set-up"},"Initial Set-up"),(0,i.kt)("h3",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"The most common way for a beginner to run a validator is on a cloud server running Linux. You may\nchoose whatever ",(0,i.kt)("a",{parentName:"p",href:"#note-about-vps"},"VPS")," provider that you prefer. As OS it is best to use a recent\nDebian Linux. For this guide we will be using ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu 22.04"),", but the instructions should be\nsimilar for other platforms."),(0,i.kt)("h4",{id:"standard-hardware"},"Reference Hardware"),(0,i.kt)("p",null,"The transaction weights in Polkadot are benchmarked on reference hardware. We ran the benchmark on\nVM instances of two major cloud providers: Google Cloud Platform (GCP) and Amazon Web Services\n(AWS). To be specific, we used ",(0,i.kt)("inlineCode",{parentName:"p"},"n2-standard-8")," VM instance on GCP and ",(0,i.kt)("inlineCode",{parentName:"p"},"c6i.4xlarge")," on AWS. It is\nrecommended that the hardware used to run the validators at least matches the specs of the reference\nhardware in order to ensure they are able to process all blocks in time. If you use subpar hardware\nyou will possibly run into performance issues, get less era points, and potentially even get\nslashed."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"CPU"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"x86-64 compatible;"),(0,i.kt)("li",{parentName:"ul"},"Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);"),(0,i.kt)("li",{parentName:"ul"},"4 physical cores @ 3.4GHz;"),(0,i.kt)("li",{parentName:"ul"},"Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);"),(0,i.kt)("li",{parentName:"ul"},"Prefer single-threaded performance over higher cores count. A comparison of single-threaded\nperformance can be found ",(0,i.kt)("a",{parentName:"li",href:"https://www.cpubenchmark.net/singleThread.html"},"here"),"."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Storage"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"An NVMe SSD of 1 TB (As it should be reasonably sized to deal with blockchain growth). An\nestimation of current chain snapshot sizes can be found ",(0,i.kt)("a",{parentName:"li",href:"https://paranodes.io/DBSize"},"here"),". In\ngeneral, the latency is more important than the throughput."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Memory"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"32 GB DDR4 ECC."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"System"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Linux Kernel 5.16 or newer."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Network"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The minimum symmetric networking speed is set to 500 Mbit/s (= 62.5 MB/s). This is required to\nsupport a large number of parachains and allow for proper congestion control in busy network\nsituations.")))),(0,i.kt)("p",null,"The specs posted above are not a ",(0,i.kt)("em",{parentName:"p"},"hard")," requirement to run a validator, but are considered best\npractice. Running a validator is a responsible task; using professional hardware is a must in any\nway."),(0,i.kt)("h3",{id:"install--configure-network-time-protocol-ntp-client"},"Install & Configure Network Time Protocol (NTP) Client"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Network_Time_Protocol"},"NTP")," is a networking protocol designed to\nsynchronize the clocks of computers over a network. NTP allows you to synchronize the clocks of all\nthe systems within the network. Currently it is required that validators' local clocks stay\nreasonably in sync, so you should be running NTP or a similar service. You can check whether you\nhave the NTP client by running:"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"If you are using Ubuntu 18.04 or a newer version, NTP Client should be installed by default.")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"timedatectl\n")),(0,i.kt)("p",null,"If NTP is installed and running, you should see ",(0,i.kt)("inlineCode",{parentName:"p"},"System clock synchronized: yes")," (or a similar\nmessage). If you do not see it, you can install it by executing:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install ntp\n")),(0,i.kt)("p",null,"ntpd will be started automatically after install. You can query ntpd for status information to\nverify that everything is working:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo ntpq -p\n")),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Skipping this can result in the validator node missing block authorship opportunities. If the clock\nis out of sync (even by a small amount), the blocks the validator produces may not get accepted by\nthe network. This will result in ",(0,i.kt)("inlineCode",{parentName:"p"},"ImOnline")," heartbeats making it on chain, but zero allocated blocks\nmaking it on chain.")),(0,i.kt)("h3",{id:"make-sure-landlock-is-enabled"},"Make Sure Landlock is Enabled"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html"},"Landlock")," is a Linux security feature used in\nPolkadot:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Landlock empowers any process, including unprivileged ones, to securely restrict themselves.")),(0,i.kt)("p",null,"To make use of landlock, make sure you are on the reference kernel version or newer. Most Linux\ndistributions should already have landlock enabled, but you can check by running the following as\nroot:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"dmesg | grep landlock || journalctl -kg landlock\n")),(0,i.kt)("p",null,"If it is not enabled, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html#kernel-support"},'official docs ("Kernel support")'),"\nif you would like to build Linux with landlock enabled."),(0,i.kt)("h3",{id:"installing-the-polkadot-binaries"},"Installing the Polkadot binaries"),(0,i.kt)("admonition",{title:"Multiple Validator Binaries",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"In addition to the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," binary, recent changes have separated out functionality into two\nadditional needed binaries, ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-prepare-worker"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-execute-worker"),". All three\nbinaries are needed to properly run a validator node. More context on these changes can be found\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/7337"},"here"))),(0,i.kt)("h4",{id:"installation-from-official-releases"},"Installation from official releases"),(0,i.kt)("p",null,"The official binaries can be downloaded from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/releases"},"Github Releases"),". You should download the latest\navailable version. You can also download the binaries by using the following direct links (replace\nX.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-execute-worker\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-prepare-worker\n")),(0,i.kt)("h4",{id:"optional-installation-with-package-managers"},"Optional: Installation with Package Managers"),(0,i.kt)("p",null,"The Polkadot Binary in included in ",(0,i.kt)("inlineCode",{parentName:"p"},"Debian")," derivatives (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Debian"),", ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu"),") and\n",(0,i.kt)("inlineCode",{parentName:"p"},"RPM-based")," distros (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Fedora"),", ",(0,i.kt)("strong",{parentName:"p"},"CentOS"),")."),(0,i.kt)("h4",{id:"debian-based-debian-ubuntu"},"Debian-based (Debian, Ubuntu)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ssh"},"# Import the security@parity.io GPG key\ngpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798\ngpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg\n# Add the Parity repository and update the package index\necho 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list\napt update\n# Install the `parity-keyring` package - This will ensure the GPG key\n# used by APT remains up-to-date\napt install parity-keyring\n# Install polkadot\napt install polkadot\n")),(0,i.kt)("h4",{id:"rpm-based-fedora-centos"},"RPM-based (Fedora, CentOS)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# Install dnf-plugins-core (This might already be installed)\ndnf install dnf-plugins-core\n# Add the repository and enable it\ndnf config-manager --add-repo https://releases.parity.io/rpm/polkadot.repo\ndnf config-manager --set-enabled polkadot\n# Install polkadot (You may have to confirm the import of the GPG key, which\n# should have the following fingerprint: 9D4B2B6EB8F97156D19669A9FF0812D491B96798)\ndnf install polkadot\n")),(0,i.kt)("p",null,'Make sure you verify the installation (see the "Verify the installation" section).'),(0,i.kt)("admonition",{title:"By default, the Polkadot systemd service is disabled",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"To start the service, run:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl start polkadot.service\n"))),(0,i.kt)("h4",{id:"optional-installation-with-ansible"},"Optional: Installation with Ansible"),(0,i.kt)("p",null,"To manage Polkadot installation with Ansible, you can use the ",(0,i.kt)("strong",{parentName:"p"},"Substrate node role")," distributed on\nthe ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ansible-galaxy/"},"Parity chain operations Ansible collection")),(0,i.kt)("h4",{id:"optional-installation-with-docker"},"Optional: Installation with Docker"),(0,i.kt)("p",null,"To run Polkadot on a Docker or an OCI compatible container runtime, you can use the official\n",(0,i.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/parity/polkadot/tags"},"parity/polkadot docker image"),", available on Docker\nHub (replace X.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"docker.io/parity/polkadot:vX.Y.Z\n")),(0,i.kt)("h3",{id:"optional-building-the-polkadot-binaries-from-sources"},"Optional: Building the Polkadot binaries from sources"),(0,i.kt)("h4",{id:"prerequisites-install-rust-and-dependencies"},"Prerequisites: Install Rust and Dependencies"),(0,i.kt)("p",null,"If you have never installed Rust, you should do this first."),(0,i.kt)("p",null,"If you have already installed Rust, run the following command to make sure you are using the latest\nversion."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup update\n")),(0,i.kt)("p",null,"If not, this command will fetch the latest version of Rust and install it."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://sh.rustup.rs -sSf | sh -s -- -y\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},'If you do not have "curl" installed, run:'),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install curl\n")),(0,i.kt)("p",{parentName:"admonition"},'It will also be valuable to have "websocat" (Netcat, curl and socat for WebSockets) installed for\nRPC interactions. Installation instructions for various operating systems can be found\n',(0,i.kt)("a",{parentName:"p",href:"https://github.com/vi/websocat#installation"},"here"),".")),(0,i.kt)("p",null,"To configure your shell, run the following command."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"source $HOME/.cargo/env\n")),(0,i.kt)("p",null,"Verify your installation."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustc --version\n")),(0,i.kt)("p",null,"Finally, run this command to install the necessary dependencies for compiling and running the\nPolkadot node software."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install make clang pkg-config libssl-dev build-essential\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you are using OSX and you have ",(0,i.kt)("a",{parentName:"p",href:"https://brew.sh"},"Homebrew")," installed, you can issue the following\nequivalent command INSTEAD of the previous one:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"brew install cmake pkg-config openssl git llvm\n"))),(0,i.kt)("h4",{id:"building-the-binaries"},"Building the binaries"),(0,i.kt)("p",null,"You can build the Polkadot binaries from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot"},"paritytech/polkadot")," repository on GitHub."),(0,i.kt)("p",null,"You should generally use the latest ",(0,i.kt)("strong",{parentName:"p"},"X.Y.Z"),' tag. You should either review the output from the "git\ntag" command or view the ',(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/tags"},"Polkadot Github tags")," to see\na list of all the available release versions. You should replace ",(0,i.kt)("inlineCode",{parentName:"p"},"VERSION")," below with the latest\nbuild (i.e., the highest number)."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you prefer to use SSH rather than HTTPS, you can replace the first line of the below with"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone git@github.com:paritytech/polkadot.git\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone https://github.com/paritytech/polkadot.git\ncd polkadot\n")),(0,i.kt)("p",null,"Run the following command to find the latest version."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git tag -l | sort -V | grep -v -- '-rc'\n")),(0,i.kt)("p",null,'Find the latest version; replace "VERSION" in the commmand below and run to change your branch.'),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout VERSION\n./scripts/init.sh\n")),(0,i.kt)("p",null,"Build native code with the production profile. The following will make sure that the binaries are\nall in your ",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --path . --profile production\n")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("em",{parentName:"strong"},"This step will take a while (generally 10 - 40 minutes, depending on your hardware)."))),(0,i.kt)("admonition",{title:"Compilation Errors",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you run into compile errors, you may have to pin the version of Rust compiler to the one that was\nused to build the release. Check out ",(0,i.kt)("inlineCode",{parentName:"p"},"Rust compiler versions")," section in the release notes. This can\nbe done by running:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup install nightly-2022-05-18\nrustup target add wasm32-unknown-unknown --toolchain nightly-2022-05-18\ncargo +nightly-2022-05-18 build --release\n")),(0,i.kt)("p",{parentName:"admonition"},"You may also need to run the build more than once."),(0,i.kt)("p",{parentName:"admonition"},"If you would like to execute the tests, run the following command:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo test --all\n"))),(0,i.kt)("p",null,"If you are interested in generating keys locally, you can also install ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," from the same\ndirectory. You may then take the generated ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," executable and transfer it to an air-gapped\nmachine for extra security."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --git https://github.com/paritytech/substrate subkey\n")),(0,i.kt)("h3",{id:"verify-the-installation"},"Verify the installation"),(0,i.kt)("p",null,"After installing Polkadot, you can verify the installation by running"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot --version\npolkadot-execute-worker --version\npolkadot-prepare-worker --version\n")),(0,i.kt)("p",null,"It should return something like this (the exact versions don't matter, but they must all be the\nsame):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"0.9.43-36264cb36db\n0.9.43-36264cb36db\n0.9.43-36264cb36db\n")),(0,i.kt)("p",null,"If not, make sure that you installed all the binaries, all the binaries are somewhere in your\n",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH")," and they are all in the same folder."),(0,i.kt)("h3",{id:"synchronize-chain-data"},"Synchronize Chain Data"),(0,i.kt)("p",null,"You can begin syncing your node by running the following command if you do not want to start in\nvalidator mode right away:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot\n")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you want to run a validator on Kusama, you have an option to specify the chain. With no\nspecification, this would default to Polkadot."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --chain=kusama\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:07 Parity Polkadot\n2021-06-17 03:07:07 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:07:07 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:07:07 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:07:07 \ud83c\udff7 Node name: boiling-pet-7554\n2021-06-17 03:07:07 \ud83d\udc64 Role: FULL\n2021-06-17 03:07:07 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:07:07 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:07:10 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:10 \ud83d\udce6 Highest known block at #17914\n2021-06-17 03:07:10 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:07:10 Listening for new connections on 127.0.0.1:9944.\n")),(0,i.kt)("admonition",{title:"Example of node sync",type:"info"},(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:39 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.16.1/tcp/30333/ws/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:40 \u2699\ufe0f Syncing 218.8 bps, target=#5553764 (17 peers), best: #24034 (0x08af\u2026dcf5), finalized #23552 (0xd4f0\u20262642), \u2b07 173.5kiB/s \u2b06 12.7kiB/s\n2021-06-17 03:07:45 \u2699\ufe0f Syncing 214.8 bps, target=#5553765 (20 peers), best: #25108 (0xb272\u2026e800), finalized #25088 (0x94e6\u20268a9f), \u2b07 134.3kiB/s \u2b06 7.4kiB/s\n2021-06-17 03:07:50 \u2699\ufe0f Syncing 214.8 bps, target=#5553766 (21 peers), best: #26182 (0xe7a5\u202601a2), finalized #26112 (0xcc29\u2026b1a9), \u2b07 5.0kiB/s \u2b06 1.1kiB/s\n2021-06-17 03:07:55 \u2699\ufe0f Syncing 138.4 bps, target=#5553767 (21 peers), best: #26874 (0xcf4b\u20266553), finalized #26624 (0x9dd9\u202627f8), \u2b07 18.9kiB/s \u2b06 2.0kiB/s\n2021-06-17 03:08:00 \u2699\ufe0f Syncing 37.0 bps, target=#5553768 (22 peers), best: #27059 (0x5b73\u20266fc9), finalized #26624 (0x9dd9\u202627f8), \u2b07 14.3kiB/s \u2b06 4.4kiB/s\n"))),(0,i.kt)("admonition",{title:"Use Warp sync for faster syncing",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"By default, the node performs ",(0,i.kt)("inlineCode",{parentName:"p"},"full")," sync, which downloads and validates the full blockchain\nhistory. Full sync works by listening to announced blocks and requesting the blocks from the\nannouncing peers, or just the block headers in case of light clients."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Fast")," sync is another option that works by downloading the block header history and validating the\nauthority set changes in order to arrive at a specific (usually the most recent) header. After the\ndesired header has been reached and verified, the state can be downloaded and imported. Once this\nprocess has been completed, the node can proceed with a full sync."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --sync warp\n")),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Warp sync")," initially downloads and validates the finality proofs from\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#finality-gadget-grandpa"},"GRANDPA")," and then downloads the state of the\nlatest finalized block. After the warp sync, the node is ready to import the latest blocks from the\nnetwork and can be used as a Validator. The blocks from genesis will be downloaded in the\nbackground. Check\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/334/what-kinds-of-sync-mechanisms-does-substrate-implement/"},"this discussion"),"\nfor more information about the different sync options available.")),(0,i.kt)("admonition",{title:"Validators should sync using the RocksDb backend",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This is implicit by default, but can be explicit by passing the ",(0,i.kt)("inlineCode",{parentName:"p"},"--database RocksDb")," flag."),(0,i.kt)("p",{parentName:"admonition"},"In the future, it is recommended to switch to the faster and more efficient ParityDB option. Note\nthat ",(0,i.kt)("strong",{parentName:"p"},"ParityDB is still experimental and should not be used in production.")," If you want to test\nout ParityDB, you can add the flag ",(0,i.kt)("inlineCode",{parentName:"p"},"--database paritydb"),". Switching between database backends will\nrequire a resync.")),(0,i.kt)("p",null,"Depending on the size of the chain when you do this, this step may take anywhere from a few minutes\nto a few hours."),(0,i.kt)("p",null,"If you are interested in determining how much longer you have to go, your server logs (printed to\nSTDOUT from the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," process) will tell you the latest block your node has processed and\nverified. You can then compare that to the current highest block via\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," or the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS Block Explorer"),"."),(0,i.kt)("h4",{id:"database-snapshot-services"},"Database Snapshot Services"),(0,i.kt)("p",null,"If you start a node for the first time, it will start building from the genesis block. This process\ncan take a while depending on the database size. To make this process faster, snapshots can be used.\nSnapshots are compressed backups of the database directory of Polkadot/Kusama nodes, containing the\nwhole chain (or a pruned version of it, with states only from the latest 1000 or 256 blocks). Listed\nbelow are a few public snapshot providers for Polkadot and Kusama."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stakeworld.io/snapshot"},"Stakeworld")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkachu.com/snapshots"},"Polkachu")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkashots.io/"},"Polkashots"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"For the security of the network, it is recommended that you sync from scratch, even if you are\nrunning your node in pruning mode for validation. The reason is that if these snapshots get\ncorrupted and a majority of nodes run based on these snapshots, the network could end up running on\na non-canonical chain.")),(0,i.kt)("h2",{id:"bond-dot"},"Bond DOT"),(0,i.kt)("p",null,"It is highly recommended that you set a stash account and a staking proxy. For this, you will create\ntwo accounts and make sure each of them have at least enough funds to pay the fees for making\ntransactions. Keep most of your funds in the stash account since it is meant to be the custodian of\nyour staking funds."),(0,i.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,i.kt)("p",null,"Make sure not to bond all your DOT balance since you will be unable to pay transaction fees from\nyour bonded balance."),(0,i.kt)("p",null,"It is now time to set up our validator. We will do the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Bond the DOT of the Stash account. These DOT will be put at stake for the security of the network\nand can be slashed."),(0,i.kt)("li",{parentName:"ul"},"Select the staking proxy. This is the account that will decide when to start or stop validating.")),(0,i.kt)("p",null,"First, go to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking"),' section. Click on\n"Account Actions", and then the "+ Stash" button.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"bonding-JS-UI",src:a(90412).Z,width:"2126",height:"838"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Stash account")," - Select your Stash account. In this example, we will bond 1 DOT, where the\nminimum bonding amount is 1. Make sure that your Stash account contains ",(0,i.kt)("em",{parentName:"li"},"at least")," this much. You\ncan, of course, stake more than this."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Staking proxy account")," - Select the staking proxy account created earlier. This account will\nalso need a small amount of DOT in order to start and stop validating."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Value bonded")," - How much DOT from the Stash account you want to bond/stake. Note that you do\nnot need to bond all of the DOT in that account. Also note that you can always bond ",(0,i.kt)("em",{parentName:"li"},"more")," DOT\nlater. However, ",(0,i.kt)("em",{parentName:"li"},"withdrawing")," any bonded amount requires the duration of the unbonding period. On\nKusama, the unbonding period is 7 days. On Polkadot, the planned unbonding period is 28 days."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment destination")," - The account where the rewards from validating are sent. More info\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking/#reward-distribution"},"here"),". Starting with runtime version v23 natively\nincluded in client version ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/releases/tag/v0.9.3"},"0.9.3"),",\npayouts can go to any custom address. If you'd like to redirect payments to an account that is\nneither the staking proxy nor the stash account, set one up. Note that it is extremely unsafe to\nset an exchange address as the recipient of the staking rewards.")),(0,i.kt)("p",null,"Once everything is filled in properly, click ",(0,i.kt)("inlineCode",{parentName:"p"},"Bond")," and sign the transaction with your Stash\naccount."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"sign transaction",src:a(93002).Z,width:"2130",height:"788"})),(0,i.kt)("p",null,"After a few seconds, you should see an ",(0,i.kt)("inlineCode",{parentName:"p"},"ExtrinsicSuccess")," message."),(0,i.kt)("p",null,"Your bonded account will available under ",(0,i.kt)("inlineCode",{parentName:"p"},"Stashes"),". You should now see a new card with all your\naccounts (note: you may need to refresh the screen). The bonded amount on the right corresponds to\nthe funds bonded by the Stash account."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"stash overview",src:a(68618).Z,width:"2988",height:"508"})),(0,i.kt)("h2",{id:"set-session-keys"},"Set Session Keys"),(0,i.kt)("admonition",{title:"Session keys are consensus critical",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"If you are not sure if your node has the current session keys that you made the ",(0,i.kt)("inlineCode",{parentName:"p"},"setKeys"),"\ntransaction then you can use one of the two available RPC methods to query your node:\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#haskeypublickey-bytes-keytype-text-bool"},"hasKey")," to\ncheck for a specific key or\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#hassessionkeyssessionkeys-bytes-bool"},"hasSessionKeys"),"\nto check the full session key public key string.")),(0,i.kt)("p",null,"Once your node is fully synced, stop the process by pressing Ctrl-C. At your terminal prompt, you\nwill now start running the node."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'polkadot --validator --name "name on telemetry"\n')),(0,i.kt)("p",null,"Similarly:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:08 Parity Polkadot\n2021-06-17 03:12:08 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:12:08 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:12:08 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:12:08 \ud83c\udff7 Node name: nateched-test\n2021-06-17 03:12:08 \ud83d\udc64 Role: AUTHORITY\n2021-06-17 03:12:08 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:12:08 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:12:12 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:12 \ud83d\udce6 Highest known block at #64673\n2021-06-17 03:12:12 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:12:12 Listening for new connections on 127.0.0.1:9944.\n2021-06-17 03:12:12 \ud83d\udc76 Starting BABE Authorship worker\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:16 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.11.1/tcp/30333/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:17 \u2699\ufe0f Syncing, target=#5553810 (14 peers), best: #65068 (0x6da5\u20260662), finalized #65024 (0x4e84\u2026d170), \u2b07 352.2kiB/s \u2b06 75.6kiB/s\n")),(0,i.kt)("p",null,"You can give your validator any name that you like, but note that others will be able to see it, and\nit will be included in the list of all servers using the same telemetry server. Since numerous\npeople are using telemetry, it is recommended that you choose something likely to be unique."),(0,i.kt)("h3",{id:"generating-the-session-keys"},"Generating the Session Keys"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator node with your stash account on Polkadot."),(0,i.kt)("h4",{id:"option-1-polkadotjs-apps"},"Option 1: PolkadotJS-APPS"),(0,i.kt)("p",null,"You can generate your ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"Session keys")," in the client via the apps RPC.\nIf you are doing this, make sure that you have the PolkadotJS-Apps explorer attached to your\nvalidator node. You can configure the apps dashboard to connect to the endpoint of your validator in\nthe Settings tab. If you are connected to a default endpoint hosted by Parity of Web3 Foundation,\nyou will not be able to use this method since making RPC requests to this node would effect the\nlocal keystore hosted on a ",(0,i.kt)("em",{parentName:"p"},"public node")," and you want to make sure you are interacting with the\nkeystore for ",(0,i.kt)("em",{parentName:"p"},"your node"),"."),(0,i.kt)("p",null,"Once ensuring that you have connected to your node, the easiest way to set session keys for your\nnode is by calling the ",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys")," RPC request to create new keys in your validator's\nkeystore. Navigate to Toolbox tab and select RPC Calls then select the author > rotateKeys() option\nand remember to save the output that you get back for a later step."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Explorer RPC call",src:a(54061).Z,width:"1700",height:"582"})),(0,i.kt)("h4",{id:"option-2-cli"},"Option 2: CLI"),(0,i.kt)("p",null,"If you are on a remote server, it is easier to run this command on the same machine (while the node\nis running with the default WS RPC port configured):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'echo \'{"id":1,"jsonrpc":"2.0","method":"author_rotateKeys","params":[]}\' | websocat -n1 -B 99999999 ws://127.0.0.1:9944\n')),(0,i.kt)("p",null,'The output will have a hex-encoded "result" field. The result is the concatenation of the four\npublic keys. Save this result for a later step.'),(0,i.kt)("p",null,"You can restart your node at this point."),(0,i.kt)("h3",{id:"submitting-the-setkeys-transaction"},"Submitting the ",(0,i.kt)("inlineCode",{parentName:"h3"},"setKeys")," Transaction"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator with your staking proxy."),(0,i.kt)("p",null,"Go to ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking > Account Actions"),', and click "Set\nSession Key" on the bonding account you generated earlier. Enter the output from ',(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),'\nin the field and click "Set Session Key".'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking-change-session",src:a(72316).Z,width:"2792",height:"182"}),"\n",(0,i.kt)("img",{alt:"staking-session-result",src:a(12883).Z,width:"2146",height:"680"})),(0,i.kt)("p",null,"Submit this extrinsic and you are now ready to start validating."),(0,i.kt)("h2",{id:"validate"},"Validate"),(0,i.kt)("p",null,"To verify that your node is live and synchronized, head to\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," and find your node. Note that this\nwill show all nodes on the Polkadot network, which is why it is important to select a unique name!"),(0,i.kt)("p",null,"In this example, we used the name ",(0,i.kt)("inlineCode",{parentName:"p"},"techedtest")," and have successfully located it upon searching:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-telemetry",src:a(67929).Z,width:"2862",height:"472"})),(0,i.kt)("h3",{id:"setup-via-validator-tab"},"Setup via Validator Tab"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-validate-1",src:a(63670).Z,width:"2128",height:"1022"})),(0,i.kt)("p",null,"Here you will need to input the Keys from ",(0,i.kt)("inlineCode",{parentName:"p"},"rotateKeys"),", which is the Hex output from\n",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),". The keys will show as pending until applied at the start of a new session."),(0,i.kt)("p",null,'The "reward commission percentage" is the commission percentage that you can declare against your\nvalidator\'s rewards. This is the rate that your validator will be commissioned with.'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment preferences")," - You can specify the percentage of the rewards that will get paid to you.\nThe remaining will be split among your nominators.")),(0,i.kt)("admonition",{title:"Setting a commission rate of 100% suggests that you do not want your validator to receive",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"nominations")),(0,i.kt)("p",null,'You can also determine if you would like to receive nominations with the "allows new nominations"\noption.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard validate",src:a(44281).Z,width:"2126",height:"694"})),(0,i.kt)("p",null,'Click "Bond & Validate".'),(0,i.kt)("p",null,'If you go to the "Staking" tab, you will see a list of active validators currently running on the\nnetwork. At the top of the page, it shows the number of validator slots that are available as well\nas the number of nodes that have signaled their intention to be a validator. You can go to the\n"Waiting" tab to double check to see whether your node is listed there.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking queue",src:a(46513).Z,width:"2838",height:"1440"})),(0,i.kt)("p",null,"The validator set is refreshed every era. In the next era, if there is a slot available and your\nnode is selected to join the validator set, your node will become an active validator. Until then,\nit will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue. If your validator is not selected to become part of the\nvalidator set, it will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue until it is. There is no need to re-start if\nyou are not selected for the validator set in a particular era. However, it may be necessary to\nincrease the number of DOT staked or seek out nominators for your validator in order to join the\nvalidator set."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Congratulations!")," If you have followed all of these steps, and been selected to be a part of the\nvalidator set, you are now running a Polkadot validator! If you need help, reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation"},"Polkadot Validator chat"),"."),(0,i.kt)("h2",{id:"thousand-validators-programme"},"Thousand Validators Programme"),(0,i.kt)("p",null,"The Thousand Validators Programme is a joint initiative by Web3 Foundation and Parity Technologies\nto provide support for community validators. If you are interested in applying for the programme,\nyou can find more information ",(0,i.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"on the wiki page"),"."),(0,i.kt)("h2",{id:"running-a-validator-on-a-testnet"},"Running a validator on a testnet"),(0,i.kt)("p",null,"To verify your validator set up, it is possible to run it against a PoS test network such as Westend\nor Wococo. However, validator slots are intentionally limited on Westend to ensure the stability and\navailability of the testnet for the Polkadot release process. As such it is advised for node\noperators wishing to run testnet validators to join the Wococo network. You can obtain WOOK tokens\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-DOT#getting-tokens-on-the-wococo-testnet"},"here"),"."),(0,i.kt)("p",null,"Here is a small comparison of each network characteristics as relevant to validators:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Network"),(0,i.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,i.kt)("th",{parentName:"tr",align:null},"Westend"),(0,i.kt)("th",{parentName:"tr",align:null},"Wococo"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"epoch"),(0,i.kt)("td",{parentName:"tr",align:null},"4h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h"),(0,i.kt)("td",{parentName:"tr",align:null},"10m")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"era"),(0,i.kt)("td",{parentName:"tr",align:null},"1d"),(0,i.kt)("td",{parentName:"tr",align:null},"6h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"token"),(0,i.kt)("td",{parentName:"tr",align:null},"DOT"),(0,i.kt)("td",{parentName:"tr",align:null},"WND (test)"),(0,i.kt)("td",{parentName:"tr",align:null},"WOOK (test)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"active validators"),(0,i.kt)("td",{parentName:"tr",align:null},"~300"),(0,i.kt)("td",{parentName:"tr",align:null},"~20"),(0,i.kt)("td",{parentName:"tr",align:null},"10 /sys/devices/system/cpu/cpu$cpunum/online\ndone\n")),(0,i.kt)("p",null,"It will disable every other (vCPU) core."),(0,i.kt)("p",null,"To save changes permanently add ",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," as kernel parameter. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After the reboot\nyou should see half of the cores are offline. Run ",(0,i.kt)("inlineCode",{parentName:"p"},"lscpu --extended")," to confirm."),(0,i.kt)("h3",{id:"disable-automatic-numa-balancing"},"Disable automatic NUMA balancing"),(0,i.kt)("p",null,"If you have multiple physical CPUs (CPU0 and CPU1) in the system each with its own memory bank (MB0\nand MB1), then it is usually slower for a CPU0 to access MB1 due to the slower interconnection. To\nprevent the OS from automatically moving the running Substrate process from one CPU to another and\nthus causing an increased latency, it is recommended to disable automatic NUMA balancing."),(0,i.kt)("p",null,"With automatic NUMA balancing disabled, an OS will always run a process on the same NUMA node where\nit was initially scheduled."),(0,i.kt)("p",null,"To disable NUMA balancing in runtime:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sysctl kernel.numa_balancing=0\n")),(0,i.kt)("p",null,"To save changes permanently, update startup options and reconfigure GRUB. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub"),"\nand add ",(0,i.kt)("inlineCode",{parentName:"p"},"numa_balancing=disable")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run\n",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After reboot you can confirm the change by running\n",(0,i.kt)("inlineCode",{parentName:"p"},"sysctl -a | grep 'kernel.numa_balancing'")," and checking if the parameter is set to 0"),(0,i.kt)("h3",{id:"configure-spectremeltdown-mitigations"},"Configure Spectre/Meltdown Mitigations"),(0,i.kt)("p",null,"Spectre and Meltdown are vulnerabilities discovered in modern CPUs a few years ago. Mitigations were\nmade to the Linux kernel to cope with the multiple variations of these attacks. Check out\n",(0,i.kt)("a",{parentName:"p",href:"https://meltdownattack.com/"},"https://meltdownattack.com/")," for more info."),(0,i.kt)("p",null,"Initially those mitigations added ~20% penalty to the performance of the workloads. As CPU\nmanufacturers started to roll-out mitigations implemented in hardware, the performance gap\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=article&item=3-years-specmelt&num=1"},"narrowed down"),". As the\nbenchmark demonstrates, the performance penalty got reduced to ~7% on Intel 10th Gen CPUs. This is\ntrue for the workloads running on both bare-metal and VMs. But the penalty remains high for the\ncontainerized workloads in some cases."),(0,i.kt)("p",null,"As demonstrated in\n",(0,i.kt)("a",{parentName:"p",href:"http://mamememo.blogspot.com/2020/05/cpu-intensive-rubypython-code-runs.html"},"Yusuke Endoh's article"),",\na performance penalty for containerized workloads can be as high as 100%. This is due to SECCOMP\nprofile being overprotective about applying Spectre/Meltdown mitigations without providing real\nsecurity. A longer explanation is a available in the\n",(0,i.kt)("a",{parentName:"p",href:"https://lkml.org/lkml/2020/11/4/1135"},"kernel patch discussion"),"."),(0,i.kt)("p",null,"Linux 5.16\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=news_item&px=Linux-Spectre-SECCOMP-Default"},"loosened the protections"),"\napplied to SECCOMP threads by default. Containers running on kernel 5.16 and later now don't suffer\nfrom the performance penalty implied by using a SECCOMP profile in container runtimes."),(0,i.kt)("h4",{id:"for-linux--516"},"For Linux >= 5.16"),(0,i.kt)("p",null,"You are all set. The performance of containerized workloads is on par with non-containerized ones.\nYou don't have to do anything."),(0,i.kt)("h4",{id:"for-linux--516-1"},"For Linux < 5.16"),(0,i.kt)("p",null,"You'll need to disable mitigations for Spectre V2 for user-space tasks as well as Speculative Store\nBypass Disable (SSBD) for Spectre V4.\n",(0,i.kt)("a",{parentName:"p",href:"https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/commit/?h=for-next/seccomp&id=2f46993d83ff4abb310ef7b4beced56ba96f0d9d"},"This patch message"),"\ndescribes the reasoning for this default change in more detail:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Ultimately setting SSBD and STIBP by default for all seccomp jails is a bad sweet spot and bad\ndefault with more cons than pros that end up reducing security in the public cloud (by giving an\nhuge incentive to not expose SPEC_CTRL which would be needed to get full security with IBPB after\nsetting nosmt in the guest) and by excessively hurting performance to more secure apps using\nseccomp that end up having to opt out with SECCOMP_FILTER_FLAG_SPEC_ALLOW.")),(0,i.kt)("p",null,"To disable the mitigations edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"spec_store_bypass_disable=prctl spectre_v2_user=prctl")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable,\nrun ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),", then reboot."),(0,i.kt)("p",null,"Note that mitigations are not disabled completely. You can fully disable all the available kernel\nmitigations by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"mitigations=off"),". But we don't recommend doing this unless you run a fully\ntrusted code on the host."),(0,i.kt)("h3",{id:"vps-list"},"VPS List"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://cloud.google.com/"},"Google Cloud")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/"},"Amazon AWS")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.ovh.com.au/"},"OVH")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.digitalocean.com/"},"Digital Ocean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.vultr.com/"},"Vultr")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.linode.com/"},"Linode")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.scaleway.com/"},"Scaleway")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://onfinality.io/"},"OnFinality"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"Beware of the ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Terms and Conditions")," and ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Acceptable Use Policies")," for each VPS"),(0,i.kt)("p",{parentName:"admonition"},"provider"),(0,i.kt)("p",{parentName:"admonition"},'You may be locked out of your account and your server shut down if you come in violation. For\ninstance, Digital Ocean lists "Mining of Cryptocurrencies" under the Network Abuse section of their\n',(0,i.kt)("a",{parentName:"p",href:"https://www.digitalocean.com/legal/acceptable-use-policy/"},"Acceptable Use Policy")," and requires\nexplicit permission to do so. This may extend to other cryptocurrency activity.")))}g.isMDXComponent=!0},90412:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-bond-2bfd021c464250a25a19673b683d7313.png"},93002:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-sign-transaction-a30448bf487f435ad9815b52aa616ffd.png"},68618:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-stash-overview-d72b15255526478756df3475968de06b.png"},46513:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-staking-4005504ef30291ebe1a243298c351a34.png"},67929:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-telemetry-8930bdd60309c864ed682a1bdd4b1e31.png"},63670:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-1-4bf6a6488b4e128d12cab2617025d796.png"},44281:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-2-18a8869804f89ffebafa1b920e31ccd6.png"},54061:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-explorer-rotatekeys-rpc-6d5ba5d9ffb20fd9683432e9a6ccd0f9.jpg"},29009:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-zero-peer-2642d52b7e07893a66a0ddfd492cce38.jpg"},72316:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-1-b0cdb38a299d6ef6bcc24c6ab2bce66d.png"},12883:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-2-408efe22daa8d6533715987a1099828a.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/a74a59a0.18f93eb1.js b/assets/js/a74a59a0.18f93eb1.js new file mode 100644 index 000000000000..bcb84f9abedc --- /dev/null +++ b/assets/js/a74a59a0.18f93eb1.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[8702],{12418:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(34200),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,d,p,u,c,h,m,k;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i=new r.U(a),e.next=3,s.G.create({provider:i});case 3:return d=e.sent,e.next=6,Promise.all([d.query.session.validators(),d.query.staking.currentEra()]);case 6:return p=e.sent,u=p[0],c=p[1],e.next=11,d.query.staking.erasStakers(c.toString(),u[0]);case 11:return h=e.sent,m=parseInt(h.total),e.next=15,d.query.staking.erasStakers.entries(c.toString());case 15:e.sent.forEach((function(e){e[0];var t=e[1],a=parseInt(t.total);a{"use strict";a.d(t,{Z:()=>c});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(34200),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:p=e.sent,(u=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,p=(0,i.useState)(""),c=p[0],h=p[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?u(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},11300:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>g,frontMatter:()=>d,metadata:()=>u,toc:()=>h});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=a(12418),l=["components"],d={id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},p=void 0,u={unversionedId:"maintain/maintain-guides-how-to-validate-polkadot",id:"maintain/maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",description:"The fundamentals for running a Polkadot validator.",source:"@site/../docs/maintain/maintain-guides-how-to-validate-polkadot.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-validate-polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-validate-polkadot.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695017532,formattedLastUpdatedAt:"Sep 18, 2023",frontMatter:{id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},sidebar:"docs",previous:{title:"Nominator Guides",permalink:"/docs/maintain-guides-how-to-nominate-polkadot"},next:{title:"Validator Payout Overview",permalink:"/docs/maintain-guides-validator-payout"}},c={},h=[{value:"Preliminaries",id:"preliminaries",level:2},{value:"How many DOT do I need to become an active Validator?",id:"how-many-dot-do-i-need-to-become-an-active-validator",level:3},{value:"Initial Set-up",id:"initial-set-up",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Reference Hardware",id:"standard-hardware",level:4},{value:"Install & Configure Network Time Protocol (NTP) Client",id:"install--configure-network-time-protocol-ntp-client",level:3},{value:"Make Sure Landlock is Enabled",id:"make-sure-landlock-is-enabled",level:3},{value:"Installing the Polkadot binaries",id:"installing-the-polkadot-binaries",level:3},{value:"Installation from official releases",id:"installation-from-official-releases",level:4},{value:"Optional: Installation with Package Managers",id:"optional-installation-with-package-managers",level:4},{value:"Debian-based (Debian, Ubuntu)",id:"debian-based-debian-ubuntu",level:4},{value:"RPM-based (Fedora, CentOS)",id:"rpm-based-fedora-centos",level:4},{value:"Optional: Installation with Ansible",id:"optional-installation-with-ansible",level:4},{value:"Optional: Installation with Docker",id:"optional-installation-with-docker",level:4},{value:"Optional: Building the Polkadot binaries from sources",id:"optional-building-the-polkadot-binaries-from-sources",level:3},{value:"Prerequisites: Install Rust and Dependencies",id:"prerequisites-install-rust-and-dependencies",level:4},{value:"Building the binaries",id:"building-the-binaries",level:4},{value:"Verify the installation",id:"verify-the-installation",level:3},{value:"Synchronize Chain Data",id:"synchronize-chain-data",level:3},{value:"Database Snapshot Services",id:"database-snapshot-services",level:4},{value:"Bond DOT",id:"bond-dot",level:2},{value:"Set Session Keys",id:"set-session-keys",level:2},{value:"Generating the Session Keys",id:"generating-the-session-keys",level:3},{value:"Option 1: PolkadotJS-APPS",id:"option-1-polkadotjs-apps",level:4},{value:"Option 2: CLI",id:"option-2-cli",level:4},{value:"Submitting the setKeys Transaction",id:"submitting-the-setkeys-transaction",level:3},{value:"Validate",id:"validate",level:2},{value:"Setup via Validator Tab",id:"setup-via-validator-tab",level:3},{value:"Thousand Validators Programme",id:"thousand-validators-programme",level:2},{value:"Running a validator on a testnet",id:"running-a-validator-on-a-testnet",level:2},{value:"FAQ",id:"faq",level:2},{value:"Why am I unable to synchronize the chain with 0 peers?",id:"why-am-i-unable-to-synchronize-the-chain-with-0-peers",level:3},{value:"How do I clear all my chain data?",id:"how-do-i-clear-all-my-chain-data",level:3},{value:"Note about VPS",id:"note-about-vps",level:2},{value:"Disable SMT",id:"disable-smt",level:3},{value:"Disable automatic NUMA balancing",id:"disable-automatic-numa-balancing",level:3},{value:"Configure Spectre/Meltdown Mitigations",id:"configure-spectremeltdown-mitigations",level:3},{value:"For Linux >= 5.16",id:"for-linux--516",level:4},{value:"For Linux < 5.16",id:"for-linux--516-1",level:4},{value:"VPS List",id:"vps-list",level:3}],m={toc:h},k="wrapper";function g(e){var t=e.components,d=(0,o.Z)(e,l);return(0,i.kt)(k,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"If you are a beginner, it is recommended that you start your validator journey on Kusama network.\nCheck the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"Kusama guide")," for details on how to get\nstarted.")),(0,i.kt)("h2",{id:"preliminaries"},"Preliminaries"),(0,i.kt)("p",null,"Running a validator on a live network is a lot of responsibility! You will be accountable for not\nonly your own stake, but also the stake of your current nominators. If you make a mistake and get\nslashed, your tokens and your reputation will be at risk. However, running a validator can also be\nvery rewarding, knowing that you contribute to the security of a decentralized network while growing\nyour stash."),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"It is highly recommended that you have significant system administration experience before\nattempting to run your own validator."),(0,i.kt)("p",{parentName:"admonition"},"You must be able to handle technical issues and anomalies with your node which you must be able to\ntackle yourself. Being a validator involves more than just executing the Polkadot binary.")),(0,i.kt)("p",null,"Since security is so important to running a successful validator, you should take a look at the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator")," information to make sure you understand the\nfactors to consider when constructing your infrastructure. As you progress in your journey as a\nvalidator, you will likely want to use this repository as a ",(0,i.kt)("em",{parentName:"p"},"starting point")," for your own\nmodifications and customizations."),(0,i.kt)("p",null,"If you need help, please reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/#polkadotvalidatorlounge:web3.foundation"},"Polkadot Validator Lounge")," on\nElement. The team and other validators are there to help answer questions and provide tips from\nexperience."),(0,i.kt)("h3",{id:"how-many-dot-do-i-need-to-become-an-active-validator"},"How many DOT do I need to become an active Validator?"),(0,i.kt)("p",null,"You can have a rough estimate on that by using the methods listed\n",(0,i.kt)("a",{parentName:"p",href:"/docs/faq/#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),".\nTo be elected into the set, you need a minimum stake behind your validator. This stake can come from\nyourself or from ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominators"),". This means that as a minimum, you will\nneed enough DOT to set up stash and staking proxy ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"accounts")," with\nthe existential deposit, plus a little extra for transaction fees. The rest can come from\nnominators. To understand how validators are elected, check the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS Election algorithms")," page."),(0,i.kt)("admonition",{title:"On-Chain Data for Reference",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"On Polkadot, the minimum stake backing a validator in the active set is\n",(0,i.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n",""),(0,i.kt)("p",{parentName:"admonition"},"On Kusama, the minimum stake backing a validator in the active set is\n","\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,i.kt)(r.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),".")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Warning:")," Any DOT that you stake for your validator is liable to be slashed, meaning that an\ninsecure or improper setup may result in loss of DOT tokens! If you are not confident in your\nability to run a validator node, it is recommended to nominate your DOT to a trusted validator node\ninstead."),(0,i.kt)("h2",{id:"initial-set-up"},"Initial Set-up"),(0,i.kt)("h3",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"The most common way for a beginner to run a validator is on a cloud server running Linux. You may\nchoose whatever ",(0,i.kt)("a",{parentName:"p",href:"#note-about-vps"},"VPS")," provider that you prefer. As OS it is best to use a recent\nDebian Linux. For this guide we will be using ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu 22.04"),", but the instructions should be\nsimilar for other platforms."),(0,i.kt)("h4",{id:"standard-hardware"},"Reference Hardware"),(0,i.kt)("p",null,"The transaction weights in Polkadot are benchmarked on reference hardware. We ran the benchmark on\nVM instances of two major cloud providers: Google Cloud Platform (GCP) and Amazon Web Services\n(AWS). To be specific, we used ",(0,i.kt)("inlineCode",{parentName:"p"},"n2-standard-8")," VM instance on GCP and ",(0,i.kt)("inlineCode",{parentName:"p"},"c6i.4xlarge")," on AWS. It is\nrecommended that the hardware used to run the validators at least matches the specs of the reference\nhardware in order to ensure they are able to process all blocks in time. If you use subpar hardware\nyou will possibly run into performance issues, get less era points, and potentially even get\nslashed."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"CPU"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"x86-64 compatible;"),(0,i.kt)("li",{parentName:"ul"},"Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);"),(0,i.kt)("li",{parentName:"ul"},"4 physical cores @ 3.4GHz;"),(0,i.kt)("li",{parentName:"ul"},"Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);"),(0,i.kt)("li",{parentName:"ul"},"Prefer single-threaded performance over higher cores count. A comparison of single-threaded\nperformance can be found ",(0,i.kt)("a",{parentName:"li",href:"https://www.cpubenchmark.net/singleThread.html"},"here"),"."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Storage"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"An NVMe SSD of 1 TB (As it should be reasonably sized to deal with blockchain growth). An\nestimation of current chain snapshot sizes can be found ",(0,i.kt)("a",{parentName:"li",href:"https://paranodes.io/DBSize"},"here"),". In\ngeneral, the latency is more important than the throughput."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Memory"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"32 GB DDR4 ECC."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"System"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Linux Kernel 5.16 or newer."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Network"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The minimum symmetric networking speed is set to 500 Mbit/s (= 62.5 MB/s). This is required to\nsupport a large number of parachains and allow for proper congestion control in busy network\nsituations.")))),(0,i.kt)("p",null,"The specs posted above are not a ",(0,i.kt)("em",{parentName:"p"},"hard")," requirement to run a validator, but are considered best\npractice. Running a validator is a responsible task; using professional hardware is a must in any\nway."),(0,i.kt)("h3",{id:"install--configure-network-time-protocol-ntp-client"},"Install & Configure Network Time Protocol (NTP) Client"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Network_Time_Protocol"},"NTP")," is a networking protocol designed to\nsynchronize the clocks of computers over a network. NTP allows you to synchronize the clocks of all\nthe systems within the network. Currently it is required that validators' local clocks stay\nreasonably in sync, so you should be running NTP or a similar service. You can check whether you\nhave the NTP client by running:"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"If you are using Ubuntu 18.04 or a newer version, NTP Client should be installed by default.")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"timedatectl\n")),(0,i.kt)("p",null,"If NTP is installed and running, you should see ",(0,i.kt)("inlineCode",{parentName:"p"},"System clock synchronized: yes")," (or a similar\nmessage). If you do not see it, you can install it by executing:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install ntp\n")),(0,i.kt)("p",null,"ntpd will be started automatically after install. You can query ntpd for status information to\nverify that everything is working:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo ntpq -p\n")),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Skipping this can result in the validator node missing block authorship opportunities. If the clock\nis out of sync (even by a small amount), the blocks the validator produces may not get accepted by\nthe network. This will result in ",(0,i.kt)("inlineCode",{parentName:"p"},"ImOnline")," heartbeats making it on chain, but zero allocated blocks\nmaking it on chain.")),(0,i.kt)("h3",{id:"make-sure-landlock-is-enabled"},"Make Sure Landlock is Enabled"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html"},"Landlock")," is a Linux security feature used in\nPolkadot:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Landlock empowers any process, including unprivileged ones, to securely restrict themselves.")),(0,i.kt)("p",null,"To make use of landlock, make sure you are on the reference kernel version or newer. Most Linux\ndistributions should already have landlock enabled, but you can check by running the following as\nroot:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"dmesg | grep landlock || journalctl -kg landlock\n")),(0,i.kt)("p",null,"If it is not enabled, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html#kernel-support"},'official docs ("Kernel support")'),"\nif you would like to build Linux with landlock enabled."),(0,i.kt)("h3",{id:"installing-the-polkadot-binaries"},"Installing the Polkadot binaries"),(0,i.kt)("admonition",{title:"Multiple Validator Binaries",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"In addition to the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," binary, recent changes have separated out functionality into two\nadditional needed binaries, ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-prepare-worker"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-execute-worker"),". All three\nbinaries are needed to properly run a validator node. More context on these changes can be found\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/7337"},"here"))),(0,i.kt)("h4",{id:"installation-from-official-releases"},"Installation from official releases"),(0,i.kt)("p",null,"The official binaries can be downloaded from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/releases"},"Github Releases"),". You should download the\nlatest available version. You can also download the binaries by using the following direct links\n(replace X.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-execute-worker\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-prepare-worker\n")),(0,i.kt)("h4",{id:"optional-installation-with-package-managers"},"Optional: Installation with Package Managers"),(0,i.kt)("p",null,"The Polkadot Binary in included in ",(0,i.kt)("inlineCode",{parentName:"p"},"Debian")," derivatives (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Debian"),", ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu"),") and\n",(0,i.kt)("inlineCode",{parentName:"p"},"RPM-based")," distros (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Fedora"),", ",(0,i.kt)("strong",{parentName:"p"},"CentOS"),")."),(0,i.kt)("h4",{id:"debian-based-debian-ubuntu"},"Debian-based (Debian, Ubuntu)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ssh"},"# Import the security@parity.io GPG key\ngpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798\ngpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg\n# Add the Parity repository and update the package index\necho 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list\napt update\n# Install the `parity-keyring` package - This will ensure the GPG key\n# used by APT remains up-to-date\napt install parity-keyring\n# Install polkadot\napt install polkadot\n")),(0,i.kt)("h4",{id:"rpm-based-fedora-centos"},"RPM-based (Fedora, CentOS)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# Install dnf-plugins-core (This might already be installed)\ndnf install dnf-plugins-core\n# Add the repository and enable it\ndnf config-manager --add-repo https://releases.parity.io/rpm/polkadot.repo\ndnf config-manager --set-enabled polkadot\n# Install polkadot (You may have to confirm the import of the GPG key, which\n# should have the following fingerprint: 9D4B2B6EB8F97156D19669A9FF0812D491B96798)\ndnf install polkadot\n")),(0,i.kt)("p",null,'Make sure you verify the installation (see the "Verify the installation" section).'),(0,i.kt)("admonition",{title:"By default, the Polkadot systemd service is disabled",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"To start the service, run:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl start polkadot.service\n"))),(0,i.kt)("h4",{id:"optional-installation-with-ansible"},"Optional: Installation with Ansible"),(0,i.kt)("p",null,"To manage Polkadot installation with Ansible, you can use the ",(0,i.kt)("strong",{parentName:"p"},"Substrate node role")," distributed on\nthe ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ansible-galaxy/"},"Parity chain operations Ansible collection")),(0,i.kt)("h4",{id:"optional-installation-with-docker"},"Optional: Installation with Docker"),(0,i.kt)("p",null,"To run Polkadot on a Docker or an OCI compatible container runtime, you can use the official\n",(0,i.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/parity/polkadot/tags"},"parity/polkadot docker image"),", available on Docker\nHub (replace X.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"docker.io/parity/polkadot:vX.Y.Z\n")),(0,i.kt)("h3",{id:"optional-building-the-polkadot-binaries-from-sources"},"Optional: Building the Polkadot binaries from sources"),(0,i.kt)("h4",{id:"prerequisites-install-rust-and-dependencies"},"Prerequisites: Install Rust and Dependencies"),(0,i.kt)("p",null,"If you have never installed Rust, you should do this first."),(0,i.kt)("p",null,"If you have already installed Rust, run the following command to make sure you are using the latest\nversion."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup update\n")),(0,i.kt)("p",null,"If not, this command will fetch the latest version of Rust and install it."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://sh.rustup.rs -sSf | sh -s -- -y\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},'If you do not have "curl" installed, run:'),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install curl\n")),(0,i.kt)("p",{parentName:"admonition"},'It will also be valuable to have "websocat" (Netcat, curl and socat for WebSockets) installed for\nRPC interactions. Installation instructions for various operating systems can be found\n',(0,i.kt)("a",{parentName:"p",href:"https://github.com/vi/websocat#installation"},"here"),".")),(0,i.kt)("p",null,"To configure your shell, run the following command."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"source $HOME/.cargo/env\n")),(0,i.kt)("p",null,"Verify your installation."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustc --version\n")),(0,i.kt)("p",null,"Finally, run this command to install the necessary dependencies for compiling and running the\nPolkadot node software."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install make clang pkg-config libssl-dev build-essential\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you are using OSX and you have ",(0,i.kt)("a",{parentName:"p",href:"https://brew.sh"},"Homebrew")," installed, you can issue the following\nequivalent command INSTEAD of the previous one:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"brew install cmake pkg-config openssl git llvm\n"))),(0,i.kt)("h4",{id:"building-the-binaries"},"Building the binaries"),(0,i.kt)("p",null,"You can build the Polkadot binaries from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot"},"paritytech/polkadot")," repository on GitHub."),(0,i.kt)("p",null,"You should generally use the latest ",(0,i.kt)("strong",{parentName:"p"},"X.Y.Z"),' tag. You should either review the output from the "git\ntag" command or view the ',(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/tags"},"Polkadot Github tags")," to see\na list of all the available release versions. You should replace ",(0,i.kt)("inlineCode",{parentName:"p"},"VERSION")," below with the latest\nbuild (i.e., the highest number)."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you prefer to use SSH rather than HTTPS, you can replace the first line of the below with"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone git@github.com:paritytech/polkadot.git\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone https://github.com/paritytech/polkadot.git\ncd polkadot\n")),(0,i.kt)("p",null,"Run the following command to find the latest version."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git tag -l | sort -V | grep -v -- '-rc'\n")),(0,i.kt)("p",null,'Find the latest version; replace "VERSION" in the commmand below and run to change your branch.'),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout VERSION\n./scripts/init.sh\n")),(0,i.kt)("p",null,"Build native code with the production profile. The following will make sure that the binaries are\nall in your ",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --path . --profile production\n")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("em",{parentName:"strong"},"This step will take a while (generally 10 - 40 minutes, depending on your hardware)."))),(0,i.kt)("admonition",{title:"Compilation Errors",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you run into compile errors, you may have to pin the version of Rust compiler to the one that was\nused to build the release. Check out ",(0,i.kt)("inlineCode",{parentName:"p"},"Rust compiler versions")," section in the release notes. This can\nbe done by running:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup install nightly-2022-05-18\nrustup target add wasm32-unknown-unknown --toolchain nightly-2022-05-18\ncargo +nightly-2022-05-18 build --release\n")),(0,i.kt)("p",{parentName:"admonition"},"You may also need to run the build more than once."),(0,i.kt)("p",{parentName:"admonition"},"If you would like to execute the tests, run the following command:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo test --all\n"))),(0,i.kt)("p",null,"If you are interested in generating keys locally, you can also install ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," from the same\ndirectory. You may then take the generated ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," executable and transfer it to an air-gapped\nmachine for extra security."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --git https://github.com/paritytech/substrate subkey\n")),(0,i.kt)("h3",{id:"verify-the-installation"},"Verify the installation"),(0,i.kt)("p",null,"After installing Polkadot, you can verify the installation by running"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot --version\npolkadot-execute-worker --version\npolkadot-prepare-worker --version\n")),(0,i.kt)("p",null,"It should return something like this (the exact versions don't matter, but they must all be the\nsame):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"0.9.43-36264cb36db\n0.9.43-36264cb36db\n0.9.43-36264cb36db\n")),(0,i.kt)("p",null,"If not, make sure that you installed all the binaries, all the binaries are somewhere in your\n",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH")," and they are all in the same folder."),(0,i.kt)("h3",{id:"synchronize-chain-data"},"Synchronize Chain Data"),(0,i.kt)("p",null,"You can begin syncing your node by running the following command if you do not want to start in\nvalidator mode right away:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot\n")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you want to run a validator on Kusama, you have an option to specify the chain. With no\nspecification, this would default to Polkadot."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --chain=kusama\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:07 Parity Polkadot\n2021-06-17 03:07:07 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:07:07 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:07:07 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:07:07 \ud83c\udff7 Node name: boiling-pet-7554\n2021-06-17 03:07:07 \ud83d\udc64 Role: FULL\n2021-06-17 03:07:07 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:07:07 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:07:10 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:10 \ud83d\udce6 Highest known block at #17914\n2021-06-17 03:07:10 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:07:10 Listening for new connections on 127.0.0.1:9944.\n")),(0,i.kt)("admonition",{title:"Example of node sync",type:"info"},(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:39 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.16.1/tcp/30333/ws/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:40 \u2699\ufe0f Syncing 218.8 bps, target=#5553764 (17 peers), best: #24034 (0x08af\u2026dcf5), finalized #23552 (0xd4f0\u20262642), \u2b07 173.5kiB/s \u2b06 12.7kiB/s\n2021-06-17 03:07:45 \u2699\ufe0f Syncing 214.8 bps, target=#5553765 (20 peers), best: #25108 (0xb272\u2026e800), finalized #25088 (0x94e6\u20268a9f), \u2b07 134.3kiB/s \u2b06 7.4kiB/s\n2021-06-17 03:07:50 \u2699\ufe0f Syncing 214.8 bps, target=#5553766 (21 peers), best: #26182 (0xe7a5\u202601a2), finalized #26112 (0xcc29\u2026b1a9), \u2b07 5.0kiB/s \u2b06 1.1kiB/s\n2021-06-17 03:07:55 \u2699\ufe0f Syncing 138.4 bps, target=#5553767 (21 peers), best: #26874 (0xcf4b\u20266553), finalized #26624 (0x9dd9\u202627f8), \u2b07 18.9kiB/s \u2b06 2.0kiB/s\n2021-06-17 03:08:00 \u2699\ufe0f Syncing 37.0 bps, target=#5553768 (22 peers), best: #27059 (0x5b73\u20266fc9), finalized #26624 (0x9dd9\u202627f8), \u2b07 14.3kiB/s \u2b06 4.4kiB/s\n"))),(0,i.kt)("admonition",{title:"Use Warp sync for faster syncing",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"By default, the node performs ",(0,i.kt)("inlineCode",{parentName:"p"},"full")," sync, which downloads and validates the full blockchain\nhistory. Full sync works by listening to announced blocks and requesting the blocks from the\nannouncing peers, or just the block headers in case of light clients."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Fast")," sync is another option that works by downloading the block header history and validating the\nauthority set changes in order to arrive at a specific (usually the most recent) header. After the\ndesired header has been reached and verified, the state can be downloaded and imported. Once this\nprocess has been completed, the node can proceed with a full sync."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --sync warp\n")),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Warp sync")," initially downloads and validates the finality proofs from\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#finality-gadget-grandpa"},"GRANDPA")," and then downloads the state of the\nlatest finalized block. After the warp sync, the node is ready to import the latest blocks from the\nnetwork and can be used as a Validator. The blocks from genesis will be downloaded in the\nbackground. Check\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/334/what-kinds-of-sync-mechanisms-does-substrate-implement/"},"this discussion"),"\nfor more information about the different sync options available.")),(0,i.kt)("admonition",{title:"Validators should sync using the RocksDb backend",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This is implicit by default, but can be explicit by passing the ",(0,i.kt)("inlineCode",{parentName:"p"},"--database RocksDb")," flag."),(0,i.kt)("p",{parentName:"admonition"},"In the future, it is recommended to switch to the faster and more efficient ParityDB option. Note\nthat ",(0,i.kt)("strong",{parentName:"p"},"ParityDB is still experimental and should not be used in production.")," If you want to test\nout ParityDB, you can add the flag ",(0,i.kt)("inlineCode",{parentName:"p"},"--database paritydb"),". Switching between database backends will\nrequire a resync.")),(0,i.kt)("p",null,"Depending on the size of the chain when you do this, this step may take anywhere from a few minutes\nto a few hours."),(0,i.kt)("p",null,"If you are interested in determining how much longer you have to go, your server logs (printed to\nSTDOUT from the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," process) will tell you the latest block your node has processed and\nverified. You can then compare that to the current highest block via\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," or the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS Block Explorer"),"."),(0,i.kt)("h4",{id:"database-snapshot-services"},"Database Snapshot Services"),(0,i.kt)("p",null,"If you start a node for the first time, it will start building from the genesis block. This process\ncan take a while depending on the database size. To make this process faster, snapshots can be used.\nSnapshots are compressed backups of the database directory of Polkadot/Kusama nodes, containing the\nwhole chain (or a pruned version of it, with states only from the latest 1000 or 256 blocks). Listed\nbelow are a few public snapshot providers for Polkadot and Kusama."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stakeworld.io/snapshot"},"Stakeworld")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkachu.com/snapshots"},"Polkachu")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkashots.io/"},"Polkashots"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"For the security of the network, it is recommended that you sync from scratch, even if you are\nrunning your node in pruning mode for validation. The reason is that if these snapshots get\ncorrupted and a majority of nodes run based on these snapshots, the network could end up running on\na non-canonical chain.")),(0,i.kt)("h2",{id:"bond-dot"},"Bond DOT"),(0,i.kt)("p",null,"It is highly recommended that you set a stash account and a staking proxy. For this, you will create\ntwo accounts and make sure each of them have at least enough funds to pay the fees for making\ntransactions. Keep most of your funds in the stash account since it is meant to be the custodian of\nyour staking funds."),(0,i.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,i.kt)("p",null,"Make sure not to bond all your DOT balance since you will be unable to pay transaction fees from\nyour bonded balance."),(0,i.kt)("p",null,"It is now time to set up our validator. We will do the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Bond the DOT of the Stash account. These DOT will be put at stake for the security of the network\nand can be slashed."),(0,i.kt)("li",{parentName:"ul"},"Select the staking proxy. This is the account that will decide when to start or stop validating.")),(0,i.kt)("p",null,"First, go to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking"),' section. Click on\n"Account Actions", and then the "+ Stash" button.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"bonding-JS-UI",src:a(90412).Z,width:"2126",height:"838"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Stash account")," - Select your Stash account. In this example, we will bond 1 DOT, where the\nminimum bonding amount is 1. Make sure that your Stash account contains ",(0,i.kt)("em",{parentName:"li"},"at least")," this much. You\ncan, of course, stake more than this."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Staking proxy account")," - Select the staking proxy account created earlier. This account will\nalso need a small amount of DOT in order to start and stop validating."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Value bonded")," - How much DOT from the Stash account you want to bond/stake. Note that you do\nnot need to bond all of the DOT in that account. Also note that you can always bond ",(0,i.kt)("em",{parentName:"li"},"more")," DOT\nlater. However, ",(0,i.kt)("em",{parentName:"li"},"withdrawing")," any bonded amount requires the duration of the unbonding period. On\nKusama, the unbonding period is 7 days. On Polkadot, the planned unbonding period is 28 days."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment destination")," - The account where the rewards from validating are sent. More info\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking/#reward-distribution"},"here"),". Starting with runtime version v23 natively\nincluded in client version ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/releases/tag/v0.9.3"},"0.9.3"),",\npayouts can go to any custom address. If you'd like to redirect payments to an account that is\nneither the staking proxy nor the stash account, set one up. Note that it is extremely unsafe to\nset an exchange address as the recipient of the staking rewards.")),(0,i.kt)("p",null,"Once everything is filled in properly, click ",(0,i.kt)("inlineCode",{parentName:"p"},"Bond")," and sign the transaction with your Stash\naccount."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"sign transaction",src:a(93002).Z,width:"2130",height:"788"})),(0,i.kt)("p",null,"After a few seconds, you should see an ",(0,i.kt)("inlineCode",{parentName:"p"},"ExtrinsicSuccess")," message."),(0,i.kt)("p",null,"Your bonded account will available under ",(0,i.kt)("inlineCode",{parentName:"p"},"Stashes"),". You should now see a new card with all your\naccounts (note: you may need to refresh the screen). The bonded amount on the right corresponds to\nthe funds bonded by the Stash account."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"stash overview",src:a(68618).Z,width:"2988",height:"508"})),(0,i.kt)("h2",{id:"set-session-keys"},"Set Session Keys"),(0,i.kt)("admonition",{title:"Session keys are consensus critical",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"If you are not sure if your node has the current session keys that you made the ",(0,i.kt)("inlineCode",{parentName:"p"},"setKeys"),"\ntransaction then you can use one of the two available RPC methods to query your node:\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#haskeypublickey-bytes-keytype-text-bool"},"hasKey")," to\ncheck for a specific key or\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#hassessionkeyssessionkeys-bytes-bool"},"hasSessionKeys"),"\nto check the full session key public key string.")),(0,i.kt)("p",null,"Once your node is fully synced, stop the process by pressing Ctrl-C. At your terminal prompt, you\nwill now start running the node."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'polkadot --validator --name "name on telemetry"\n')),(0,i.kt)("p",null,"Similarly:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:08 Parity Polkadot\n2021-06-17 03:12:08 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:12:08 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:12:08 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:12:08 \ud83c\udff7 Node name: nateched-test\n2021-06-17 03:12:08 \ud83d\udc64 Role: AUTHORITY\n2021-06-17 03:12:08 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:12:08 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:12:12 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:12 \ud83d\udce6 Highest known block at #64673\n2021-06-17 03:12:12 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:12:12 Listening for new connections on 127.0.0.1:9944.\n2021-06-17 03:12:12 \ud83d\udc76 Starting BABE Authorship worker\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:16 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.11.1/tcp/30333/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:17 \u2699\ufe0f Syncing, target=#5553810 (14 peers), best: #65068 (0x6da5\u20260662), finalized #65024 (0x4e84\u2026d170), \u2b07 352.2kiB/s \u2b06 75.6kiB/s\n")),(0,i.kt)("p",null,"You can give your validator any name that you like, but note that others will be able to see it, and\nit will be included in the list of all servers using the same telemetry server. Since numerous\npeople are using telemetry, it is recommended that you choose something likely to be unique."),(0,i.kt)("h3",{id:"generating-the-session-keys"},"Generating the Session Keys"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator node with your stash account on Polkadot."),(0,i.kt)("h4",{id:"option-1-polkadotjs-apps"},"Option 1: PolkadotJS-APPS"),(0,i.kt)("p",null,"You can generate your ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"Session keys")," in the client via the apps RPC.\nIf you are doing this, make sure that you have the PolkadotJS-Apps explorer attached to your\nvalidator node. You can configure the apps dashboard to connect to the endpoint of your validator in\nthe Settings tab. If you are connected to a default endpoint hosted by Parity of Web3 Foundation,\nyou will not be able to use this method since making RPC requests to this node would effect the\nlocal keystore hosted on a ",(0,i.kt)("em",{parentName:"p"},"public node")," and you want to make sure you are interacting with the\nkeystore for ",(0,i.kt)("em",{parentName:"p"},"your node"),"."),(0,i.kt)("p",null,"Once ensuring that you have connected to your node, the easiest way to set session keys for your\nnode is by calling the ",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys")," RPC request to create new keys in your validator's\nkeystore. Navigate to Toolbox tab and select RPC Calls then select the author > rotateKeys() option\nand remember to save the output that you get back for a later step."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Explorer RPC call",src:a(54061).Z,width:"1700",height:"582"})),(0,i.kt)("h4",{id:"option-2-cli"},"Option 2: CLI"),(0,i.kt)("p",null,"If you are on a remote server, it is easier to run this command on the same machine (while the node\nis running with the default WS RPC port configured):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'echo \'{"id":1,"jsonrpc":"2.0","method":"author_rotateKeys","params":[]}\' | websocat -n1 -B 99999999 ws://127.0.0.1:9944\n')),(0,i.kt)("p",null,'The output will have a hex-encoded "result" field. The result is the concatenation of the four\npublic keys. Save this result for a later step.'),(0,i.kt)("p",null,"You can restart your node at this point."),(0,i.kt)("h3",{id:"submitting-the-setkeys-transaction"},"Submitting the ",(0,i.kt)("inlineCode",{parentName:"h3"},"setKeys")," Transaction"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator with your staking proxy."),(0,i.kt)("p",null,"Go to ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking > Account Actions"),', and click "Set\nSession Key" on the bonding account you generated earlier. Enter the output from ',(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),'\nin the field and click "Set Session Key".'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking-change-session",src:a(72316).Z,width:"2792",height:"182"}),"\n",(0,i.kt)("img",{alt:"staking-session-result",src:a(12883).Z,width:"2146",height:"680"})),(0,i.kt)("p",null,"Submit this extrinsic and you are now ready to start validating."),(0,i.kt)("h2",{id:"validate"},"Validate"),(0,i.kt)("p",null,"To verify that your node is live and synchronized, head to\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," and find your node. Note that this\nwill show all nodes on the Polkadot network, which is why it is important to select a unique name!"),(0,i.kt)("p",null,"In this example, we used the name ",(0,i.kt)("inlineCode",{parentName:"p"},"techedtest")," and have successfully located it upon searching:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-telemetry",src:a(67929).Z,width:"2862",height:"472"})),(0,i.kt)("h3",{id:"setup-via-validator-tab"},"Setup via Validator Tab"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-validate-1",src:a(63670).Z,width:"2128",height:"1022"})),(0,i.kt)("p",null,"Here you will need to input the Keys from ",(0,i.kt)("inlineCode",{parentName:"p"},"rotateKeys"),", which is the Hex output from\n",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),". The keys will show as pending until applied at the start of a new session."),(0,i.kt)("p",null,'The "reward commission percentage" is the commission percentage that you can declare against your\nvalidator\'s rewards. This is the rate that your validator will be commissioned with.'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment preferences")," - You can specify the percentage of the rewards that will get paid to you.\nThe remaining will be split among your nominators.")),(0,i.kt)("admonition",{title:"Setting a commission rate of 100% suggests that you do not want your validator to receive",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"nominations")),(0,i.kt)("p",null,'You can also determine if you would like to receive nominations with the "allows new nominations"\noption.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard validate",src:a(44281).Z,width:"2126",height:"694"})),(0,i.kt)("p",null,'Click "Bond & Validate".'),(0,i.kt)("p",null,'If you go to the "Staking" tab, you will see a list of active validators currently running on the\nnetwork. At the top of the page, it shows the number of validator slots that are available as well\nas the number of nodes that have signaled their intention to be a validator. You can go to the\n"Waiting" tab to double check to see whether your node is listed there.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking queue",src:a(46513).Z,width:"2838",height:"1440"})),(0,i.kt)("p",null,"The validator set is refreshed every era. In the next era, if there is a slot available and your\nnode is selected to join the validator set, your node will become an active validator. Until then,\nit will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue. If your validator is not selected to become part of the\nvalidator set, it will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue until it is. There is no need to re-start if\nyou are not selected for the validator set in a particular era. However, it may be necessary to\nincrease the number of DOT staked or seek out nominators for your validator in order to join the\nvalidator set."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Congratulations!")," If you have followed all of these steps, and been selected to be a part of the\nvalidator set, you are now running a Polkadot validator! If you need help, reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation"},"Polkadot Validator chat"),"."),(0,i.kt)("h2",{id:"thousand-validators-programme"},"Thousand Validators Programme"),(0,i.kt)("p",null,"The Thousand Validators Programme is a joint initiative by Web3 Foundation and Parity Technologies\nto provide support for community validators. If you are interested in applying for the programme,\nyou can find more information ",(0,i.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"on the wiki page"),"."),(0,i.kt)("h2",{id:"running-a-validator-on-a-testnet"},"Running a validator on a testnet"),(0,i.kt)("p",null,"To verify your validator set up, it is possible to run it against a PoS test network such as Westend\nor Wococo. However, validator slots are intentionally limited on Westend to ensure the stability and\navailability of the testnet for the Polkadot release process. As such it is advised for node\noperators wishing to run testnet validators to join the Wococo network. You can obtain WOOK tokens\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-DOT#getting-tokens-on-the-wococo-testnet"},"here"),"."),(0,i.kt)("p",null,"Here is a small comparison of each network characteristics as relevant to validators:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Network"),(0,i.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,i.kt)("th",{parentName:"tr",align:null},"Westend"),(0,i.kt)("th",{parentName:"tr",align:null},"Wococo"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"epoch"),(0,i.kt)("td",{parentName:"tr",align:null},"4h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h"),(0,i.kt)("td",{parentName:"tr",align:null},"10m")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"era"),(0,i.kt)("td",{parentName:"tr",align:null},"1d"),(0,i.kt)("td",{parentName:"tr",align:null},"6h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"token"),(0,i.kt)("td",{parentName:"tr",align:null},"DOT"),(0,i.kt)("td",{parentName:"tr",align:null},"WND (test)"),(0,i.kt)("td",{parentName:"tr",align:null},"WOOK (test)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"active validators"),(0,i.kt)("td",{parentName:"tr",align:null},"~300"),(0,i.kt)("td",{parentName:"tr",align:null},"~20"),(0,i.kt)("td",{parentName:"tr",align:null},"10 /sys/devices/system/cpu/cpu$cpunum/online\ndone\n")),(0,i.kt)("p",null,"It will disable every other (vCPU) core."),(0,i.kt)("p",null,"To save changes permanently add ",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," as kernel parameter. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After the reboot\nyou should see half of the cores are offline. Run ",(0,i.kt)("inlineCode",{parentName:"p"},"lscpu --extended")," to confirm."),(0,i.kt)("h3",{id:"disable-automatic-numa-balancing"},"Disable automatic NUMA balancing"),(0,i.kt)("p",null,"If you have multiple physical CPUs (CPU0 and CPU1) in the system each with its own memory bank (MB0\nand MB1), then it is usually slower for a CPU0 to access MB1 due to the slower interconnection. To\nprevent the OS from automatically moving the running Substrate process from one CPU to another and\nthus causing an increased latency, it is recommended to disable automatic NUMA balancing."),(0,i.kt)("p",null,"With automatic NUMA balancing disabled, an OS will always run a process on the same NUMA node where\nit was initially scheduled."),(0,i.kt)("p",null,"To disable NUMA balancing in runtime:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sysctl kernel.numa_balancing=0\n")),(0,i.kt)("p",null,"To save changes permanently, update startup options and reconfigure GRUB. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub"),"\nand add ",(0,i.kt)("inlineCode",{parentName:"p"},"numa_balancing=disable")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run\n",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After reboot you can confirm the change by running\n",(0,i.kt)("inlineCode",{parentName:"p"},"sysctl -a | grep 'kernel.numa_balancing'")," and checking if the parameter is set to 0"),(0,i.kt)("h3",{id:"configure-spectremeltdown-mitigations"},"Configure Spectre/Meltdown Mitigations"),(0,i.kt)("p",null,"Spectre and Meltdown are vulnerabilities discovered in modern CPUs a few years ago. Mitigations were\nmade to the Linux kernel to cope with the multiple variations of these attacks. Check out\n",(0,i.kt)("a",{parentName:"p",href:"https://meltdownattack.com/"},"https://meltdownattack.com/")," for more info."),(0,i.kt)("p",null,"Initially those mitigations added ~20% penalty to the performance of the workloads. As CPU\nmanufacturers started to roll-out mitigations implemented in hardware, the performance gap\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=article&item=3-years-specmelt&num=1"},"narrowed down"),". As the\nbenchmark demonstrates, the performance penalty got reduced to ~7% on Intel 10th Gen CPUs. This is\ntrue for the workloads running on both bare-metal and VMs. But the penalty remains high for the\ncontainerized workloads in some cases."),(0,i.kt)("p",null,"As demonstrated in\n",(0,i.kt)("a",{parentName:"p",href:"http://mamememo.blogspot.com/2020/05/cpu-intensive-rubypython-code-runs.html"},"Yusuke Endoh's article"),",\na performance penalty for containerized workloads can be as high as 100%. This is due to SECCOMP\nprofile being overprotective about applying Spectre/Meltdown mitigations without providing real\nsecurity. A longer explanation is a available in the\n",(0,i.kt)("a",{parentName:"p",href:"https://lkml.org/lkml/2020/11/4/1135"},"kernel patch discussion"),"."),(0,i.kt)("p",null,"Linux 5.16\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=news_item&px=Linux-Spectre-SECCOMP-Default"},"loosened the protections"),"\napplied to SECCOMP threads by default. Containers running on kernel 5.16 and later now don't suffer\nfrom the performance penalty implied by using a SECCOMP profile in container runtimes."),(0,i.kt)("h4",{id:"for-linux--516"},"For Linux >= 5.16"),(0,i.kt)("p",null,"You are all set. The performance of containerized workloads is on par with non-containerized ones.\nYou don't have to do anything."),(0,i.kt)("h4",{id:"for-linux--516-1"},"For Linux < 5.16"),(0,i.kt)("p",null,"You'll need to disable mitigations for Spectre V2 for user-space tasks as well as Speculative Store\nBypass Disable (SSBD) for Spectre V4.\n",(0,i.kt)("a",{parentName:"p",href:"https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/commit/?h=for-next/seccomp&id=2f46993d83ff4abb310ef7b4beced56ba96f0d9d"},"This patch message"),"\ndescribes the reasoning for this default change in more detail:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Ultimately setting SSBD and STIBP by default for all seccomp jails is a bad sweet spot and bad\ndefault with more cons than pros that end up reducing security in the public cloud (by giving an\nhuge incentive to not expose SPEC_CTRL which would be needed to get full security with IBPB after\nsetting nosmt in the guest) and by excessively hurting performance to more secure apps using\nseccomp that end up having to opt out with SECCOMP_FILTER_FLAG_SPEC_ALLOW.")),(0,i.kt)("p",null,"To disable the mitigations edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"spec_store_bypass_disable=prctl spectre_v2_user=prctl")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable,\nrun ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),", then reboot."),(0,i.kt)("p",null,"Note that mitigations are not disabled completely. You can fully disable all the available kernel\nmitigations by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"mitigations=off"),". But we don't recommend doing this unless you run a fully\ntrusted code on the host."),(0,i.kt)("h3",{id:"vps-list"},"VPS List"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://cloud.google.com/"},"Google Cloud")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/"},"Amazon AWS")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.ovh.com.au/"},"OVH")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.digitalocean.com/"},"Digital Ocean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.vultr.com/"},"Vultr")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.linode.com/"},"Linode")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.scaleway.com/"},"Scaleway")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://onfinality.io/"},"OnFinality"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"Beware of the ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Terms and Conditions")," and ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Acceptable Use Policies")," for each VPS"),(0,i.kt)("p",{parentName:"admonition"},"provider"),(0,i.kt)("p",{parentName:"admonition"},'You may be locked out of your account and your server shut down if you come in violation. For\ninstance, Digital Ocean lists "Mining of Cryptocurrencies" under the Network Abuse section of their\n',(0,i.kt)("a",{parentName:"p",href:"https://www.digitalocean.com/legal/acceptable-use-policy/"},"Acceptable Use Policy")," and requires\nexplicit permission to do so. This may extend to other cryptocurrency activity.")))}g.isMDXComponent=!0},90412:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-bond-2bfd021c464250a25a19673b683d7313.png"},93002:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-sign-transaction-a30448bf487f435ad9815b52aa616ffd.png"},68618:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-stash-overview-d72b15255526478756df3475968de06b.png"},46513:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-staking-4005504ef30291ebe1a243298c351a34.png"},67929:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-telemetry-8930bdd60309c864ed682a1bdd4b1e31.png"},63670:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-1-4bf6a6488b4e128d12cab2617025d796.png"},44281:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-2-18a8869804f89ffebafa1b920e31ccd6.png"},54061:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-explorer-rotatekeys-rpc-6d5ba5d9ffb20fd9683432e9a6ccd0f9.jpg"},29009:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-zero-peer-2642d52b7e07893a66a0ddfd492cce38.jpg"},72316:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-1-b0cdb38a299d6ef6bcc24c6ab2bce66d.png"},12883:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-2-408efe22daa8d6533715987a1099828a.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ad762f86.42bdb48e.js b/assets/js/ad762f86.42bdb48e.js new file mode 100644 index 000000000000..48b4644118d4 --- /dev/null +++ b/assets/js/ad762f86.42bdb48e.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7940],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),r=a(67294),s=a(87152),i=a(34200),d=a(67425);function l(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,d,l,c,p;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,d=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new s.U(r),e.next=21,i.G.create({provider:l});case 21:c=e.sent,(p=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return d=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return d=(d=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return e.abrupt("return",d);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,a,n){switch(t){case"humanReadable":(0,d.HumanReadable)(e,a,n);break;case"precise":(0,d.Precise)(e,a,n);break;case"blocksToDays":(0,d.BlocksToDays)(e,n);break;case"percentage":(0,d.Percentage)(e,n);break;case"arrayLength":(0,d.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,i=e.filter,d=void 0===i?void 0:i,c=(0,r.useState)(""),u=c[0],m=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==d?p(s.toString(),d,t,m):m(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,a,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==d?p(o,d,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},79569:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>d,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),s=a(47940),i=["components"],d={id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},l=void 0,c={unversionedId:"learn/learn-account-advanced",id:"learn/learn-account-advanced",title:"Polkadot Accounts In-Depth",description:"Advanced Concepts about Polkadot's Accounts.",source:"@site/../docs/learn/learn-account-advanced.md",sourceDirName:"learn",slug:"/learn-account-advanced",permalink:"/docs/learn-account-advanced",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-account-advanced.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695017532,formattedLastUpdatedAt:"Sep 18, 2023",frontMatter:{id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},sidebar:"docs",previous:{title:"Advanced",permalink:"/docs/learn-advanced-index"},next:{title:"Advanced Staking Concepts",permalink:"/docs/learn-staking-advanced"}},p={},u=[{value:"Address Format",id:"address-format",level:2},{value:"Derivation Paths",id:"derivation-paths",level:2},{value:"Soft vs. Hard Derivation",id:"soft-vs-hard-derivation",level:3},{value:"For the Curious: How Prefixes Work",id:"for-the-curious-how-prefixes-work",level:2},{value:"System Accounts",id:"system-accounts",level:2},{value:"Portability",id:"portability",level:2},{value:"Address Conversion Tools",id:"address-conversion-tools",level:2},{value:"How to Verify a Public Key's Associated Address",id:"how-to-verify-a-public-keys-associated-address",level:3},{value:"Using Subkey to Retrieve Public Key from SS58 Address",id:"using-subkey-to-retrieve-public-key-from-ss58-address",level:4},{value:"Address Verification",id:"address-verification",level:4},{value:"Consider the following example:",id:"consider-the-following-example",level:5},{value:"Indices",id:"indices",level:2},{value:"Using ENS with DOT/KSM accounts",id:"using-ens-with-dotksm-accounts",level:2},{value:"Adding via the UI",id:"adding-via-the-ui",level:3},{value:"Wallet Support",id:"wallet-support",level:3},{value:"Relevant links",id:"relevant-links",level:3},{value:"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another",id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another",level:2}],m={toc:u},h="wrapper";function k(e){var t=e.components,d=(0,o.Z)(e,i);return(0,r.kt)(h,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"address-format"},"Address Format"),(0,r.kt)("p",null,"The address format used in Substrate-based chains is SS58. SS58 is a modification of Base-58-check\nfrom Bitcoin with some minor changes. Notably, the format contains an ",(0,r.kt)("em",{parentName:"p"},"address type")," prefix that\nidentifies an address belonging to a specific network."),(0,r.kt)("p",null,"For example:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"1"),"."),(0,r.kt)("li",{parentName:"ul"},"Kusama addresses always start with a capital letter, such as ",(0,r.kt)("strong",{parentName:"li"},"C, D, F, G, H, J"),"."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"5"),".")),(0,r.kt)("p",null,"These prefixes, including how to validate addresses, are embedded in the Substrate SS58 format.\nNever use regular expressions for address validation."),(0,r.kt)("p",null,"It's important to understand that different network formats are ",(0,r.kt)("strong",{parentName:"p"},"merely other representations of\nthe same public key in a private-public keypair")," generated by an address generation tool. As a\nresult, the addresses across Substrate-based chains are compatible if the format is converted\ncorrectly."),(0,r.kt)("p",null,"As of Runtime 28, the default ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts##address-format"},"address format")," is the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/primitives/runtime/src/multiaddress.rs"},(0,r.kt)("inlineCode",{parentName:"a"},"MultiAddress")),"\ntype."),(0,r.kt)("p",null,"This ",(0,r.kt)("inlineCode",{parentName:"p"},"enum")," is a multi-format address wrapper for on-chain accounts and allows us to describe\nPolkadot's default address format to represent many different address types. This includes ",(0,r.kt)("strong",{parentName:"p"},"20\nbyte"),", ",(0,r.kt)("strong",{parentName:"p"},"32 byte"),", and ",(0,r.kt)("strong",{parentName:"p"},"arbitrary raw byte")," variants. It also enhances the original\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#indices"},(0,r.kt)("inlineCode",{parentName:"a"},"indices"))," lookup."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Many wallets allow you to convert between formats. Stand-alone tools exist as well; you can find\nthem in the ",(0,r.kt)("a",{parentName:"p",href:"#address-conversion-tools"},"address conversion tools")," section.")),(0,r.kt)("h2",{id:"derivation-paths"},"Derivation Paths"),(0,r.kt)("p",null,"If you want to create and manage several accounts on the network using the same seed, you can use\nderivation paths. We can think of the derived accounts as child accounts of the root account created\nusing the original mnemonic seed phrase. Many\nPolkadot key generation tools support hard and\nsoft derivation. For instance, if you intend to create an account to be used on the\nPolkadot chain, you can derive a ",(0,r.kt)("strong",{parentName:"p"},"hard key"),"\nchild account using ",(0,r.kt)("strong",{parentName:"p"},"//")," after the mnemonic phrase."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very//0'\n")),(0,r.kt)("p",null,"and a ",(0,r.kt)("strong",{parentName:"p"},"soft key")," child account using ",(0,r.kt)("strong",{parentName:"p"},"/")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very/0'\n")),(0,r.kt)("p",null,"If you want to create another account using the Polkadot chain using the same seed, you can change\nthe number at the end of the string above. For example, ",(0,r.kt)("inlineCode",{parentName:"p"},"/1"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"/2"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"/3")," will create different\nderived accounts."),(0,r.kt)("p",null,"You can use any letters or numbers in the derivation path as long as they make sense to you; they do\nnot have to follow any specific pattern. You may combine multiple derivations in your path, as well.\nFor instance, ",(0,r.kt)("inlineCode",{parentName:"p"},"//bill//account//1")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//john/polkadot/initial")," are both valid. To recreate a\nderived account, you must know both the seed and the derivation path, so you should either use a\nwell-defined sequence (e.g. //0, //1, //2...) or be sure to write down any derivation paths you use."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"It is only possible to generate a derived account by knowing the derivation path.")),(0,r.kt)("p",null,"There is an additional type of derivation called password derivation. On Polkadot you can derive a\n",(0,r.kt)("strong",{parentName:"p"},"password key")," account using ",(0,r.kt)("strong",{parentName:"p"},"///")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very///0'\n")),(0,r.kt)("p",null,"In this type of derivation, if the mnemonic phrase leaks, accounts cannot be derived without the\ninitial password. In fact, for soft- and hard-derived accounts, if someone knows the mnemonic phrase\nand the derivation path, they will have access to your account. For password-derived accounts, the\npassword is applied on the derivation path. You can know the mnemonic phrase and the derivation\npath, but without the password, it is impossible to access the account. In mathematical terms, if we\nhave a ",(0,r.kt)("inlineCode",{parentName:"p"},"written derivation path")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),", we can calculate the ",(0,r.kt)("inlineCode",{parentName:"p"},"real derivation path")," as\n",(0,r.kt)("inlineCode",{parentName:"p"},"f(written derivation path, password)"),", where ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," is a function. We can then calculate the\n",(0,r.kt)("inlineCode",{parentName:"p"},"account key pair")," using ",(0,r.kt)("inlineCode",{parentName:"p"},"f(seed, real derivation path)"),". Unlike hard and soft derivations that can\nbe mixed, only a single password should be specified per derivation."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Password-derived account are as secure as the chosen password.")),(0,r.kt)("h3",{id:"soft-vs-hard-derivation"},"Soft vs. Hard Derivation"),(0,r.kt)("p",null,"A soft derivation allows someone to potentially \"go backward\u201d to figure out the initial account's\nprivate key if they know the derived account's private key. It is also possible to determine that\ndifferent accounts generated from the same seed are linked to that seed. A hard derivation path does\nnot allow either of these - even if you know a derived private key, it's not feasible to figure out\nthe private key of the root address, and it's impossible to prove that the first account is linked\nwith the second. These derivation methods have their use cases, given that the private keys for all\nthe derived accounts are fully secure. Unless you have a specific need for a soft derivation, it is\nrecommended to generate the account using a hard derivation path."),(0,r.kt)("p",null,"See the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"Subkey documentation")," for\ndetails and examples of derivation path formats. The Polkadot-JS Apps and Extension and Parity\nSigner support custom derivation paths using the same syntax as Subkey."),(0,r.kt)("p",null,"Some wallets will automatically add derivation paths to the end of the generated mnemonic phrase.\nThis will generate separate seeds for different paths, allowing separate signing keys with the same\nmnemonic, e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"//polkadot")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//kusama"),". Although you may\ncorrectly save the mnemonic phrase, using it in another wallet will generate the same addresses only\nif both wallets use the same derivation paths."),(0,r.kt)("p",null,"Polkadot and Kusama both have paths registered in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 registry"),"."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"You must have the ",(0,r.kt)("em",{parentName:"p"},"parent")," private key and the derivation path to arrive at the key for an address.\nOnly use custom derivation paths if you are comfortable with your knowledge of this topic.")),(0,r.kt)("h2",{id:"for-the-curious-how-prefixes-work"},"For the Curious: How Prefixes Work"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json"},"SS58 registry")," states\nthat:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000000b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"0")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Kusama (Polkadot Canary) has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000010b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"2")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate has ",(0,r.kt)("inlineCode",{parentName:"li"},"00101010b")," as the address type (",(0,r.kt)("inlineCode",{parentName:"li"},"42")," in decimal).")),(0,r.kt)("p",null,"Because the ",(0,r.kt)("inlineCode",{parentName:"p"},"Base58-check")," alphabet has no number 0, the lowest value is indeed 1. So ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000b")," is\n1 in Base58-check. If we try to\n",(0,r.kt)("a",{parentName:"p",href:"https://www.better-converter.com/Encoders-Decoders/Base58Check-to-Hexadecimal-Decoder"},"decode")," a\nPolkadot address like ",(0,r.kt)("inlineCode",{parentName:"p"},"1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg"),", the result is\n",(0,r.kt)("inlineCode",{parentName:"p"},"000aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b29d7"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"00"),",\nwhich is indeed ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000")," in binary and ",(0,r.kt)("inlineCode",{parentName:"p"},"0")," in decimal and thus matches the address type of\nPolkadot."),(0,r.kt)("p",null,"Let's take a look at Substrate addresses. If we decode\n",(0,r.kt)("inlineCode",{parentName:"p"},"5CK8D1sKNwF473wbuBP6NuhQfPaWUetNsWUNAAzVwTfxqjfr"),", we get\n",(0,r.kt)("inlineCode",{parentName:"p"},"2a0aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b77e5"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"2a"),"\nwhich when\n",(0,r.kt)("a",{parentName:"p",href:"https://www.rapidtables.com/convert/number/hex-to-decimal.html"},"converted from hex to decimal"),"\nis 42. 42 is ",(0,r.kt)("inlineCode",{parentName:"p"},"00101010")," in binary, just as the SS58 document states."),(0,r.kt)("p",null,"Finally, let's look at Kusama addresses. Decoding ",(0,r.kt)("inlineCode",{parentName:"p"},"CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp"),"\ngives us ",(0,r.kt)("inlineCode",{parentName:"p"},"020aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b0985")," with the first\nbyte being ",(0,r.kt)("inlineCode",{parentName:"p"},"02"),", just as specified. If we try a Kusama address that starts with a completely\ndifferent letter, like ",(0,r.kt)("inlineCode",{parentName:"p"},"J4iggBtsWsb61RemU2TDWDXTNHqHNfBSAkGvVZBtn1AJV1a"),", we still get ",(0,r.kt)("inlineCode",{parentName:"p"},"02")," as the\nfirst byte: ",(0,r.kt)("inlineCode",{parentName:"p"},"02f2d606a67f58fa0b3ad2b556195a0ef905676efd4e3ec62f8fa1b8461355f1142509"),". It seems\ncounterintuitive that some addresses always have the same prefix and others like Kusama can vary\nwildly, but it's just a quirk of Base58-check encoding."),(0,r.kt)("h2",{id:"system-accounts"},"System Accounts"),(0,r.kt)("p",null,"As the word suggests, system accounts are used by the system. They are used, for example, for the\ntreasury, crowdloans, and nomination pools. From the point of view of the runtime, these accounts\nare like any other account on-chain. These special system accounts are just public keys, with the\nprivate key being unknown (and unattainable). So, that means that only the pallet itself can\ninteract with this account. These accounts can never issue a signed\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics"},"extrinsic")," since they do not have a private key."),(0,r.kt)("admonition",{title:"Explore System Accounts",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Treasury account address -\n",(0,r.kt)("inlineCode",{parentName:"p"},"13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB"),"",""),(0,r.kt)("p",{parentName:"admonition"},"You can view the existing system accounts on\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/account_list?role=module"},"Subscan"),".")),(0,r.kt)("p",null,'Let us take a look at how system accounts are generated under the hood. For instance, to generate\nthe treasury account, the raw bytes of the strings "modl" and "py/trsry" are combined to create the\n',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". For more information, check the post on Substrate StackExchange on\n",(0,r.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/536/how-do-treasury-accounts-compare-to-end-user-accounts-in-frame"},"Treasury accounts"),'.\nSimilarly, to generate the crowdloan account, the raw bytes of the strings "modl" and "py/cfund"\nalong with the fund index are combined to create the ',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". Similar logic applies to\nnomination pool and parachain accounts as well."),(0,r.kt)("h2",{id:"portability"},"Portability"),(0,r.kt)("p",null,"The above information brings us to portability: the ability to use a mnemonic phrase or seed across\nmultiple wallets. Portability depends on several factors:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Derivation path"),(0,r.kt)("li",{parentName:"ul"},"Mnemonic format"),(0,r.kt)("li",{parentName:"ul"},"Seed derivation"),(0,r.kt)("li",{parentName:"ul"},"Signature scheme")),(0,r.kt)("p",null,"To use the exact mnemonic across multiple wallets, ensure they follow compatible methods for\ngenerating keys and signing messages. If you are still looking for understandable documentation,\ncontact the project maintainers."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"}),(0,r.kt)("th",{parentName:"tr",align:"center"},"Mnemonic Format"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Derivation Path"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Seed Derivation"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Signature Support"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot{.js} Extension"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot-JS Apps"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Ledger"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP39"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP44","\u2020"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32","\u2021"),(0,r.kt)("td",{parentName:"tr",align:"center"},"ed25519","\xa7")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Subkey"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k1")))),(0,r.kt)("p",null,"*"," Ed25519 keys have ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-bip39"},"limited compatibility")," with\nBIP39."),(0,r.kt)("p",null,"\u2020"," ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 Registry")),(0,r.kt)("p",null,"\u2021"," Ed25519 and BIP32 based on\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/LedgerHQ/orakolo/blob/master/papers/Ed25519_BIP%20Final.pdf"},"Khovratovich")),(0,r.kt)("p",null,"\xa7"," Sr25519 planned"),(0,r.kt)("h2",{id:"address-conversion-tools"},"Address Conversion Tools"),(0,r.kt)("p",null,"You can use the tools below to convert any SS58 address for any network for use on different\nnetworks"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot-address-convertor.netlify.app/"},"simple address converter"))),(0,r.kt)("h3",{id:"how-to-verify-a-public-keys-associated-address"},"How to Verify a Public Key's Associated Address"),(0,r.kt)("p",null,"You can verify your public key's associated address through a series of inspection steps, where the\nkey is a base-16 (hexadecimal) address."),(0,r.kt)("h4",{id:"using-subkey-to-retrieve-public-key-from-ss58-address"},"Using Subkey to Retrieve Public Key from SS58 Address"),(0,r.kt)("p",null,"This is to showcase that the ",(0,r.kt)("strong",{parentName:"p"},'SS58 address is based on the public key (aka "Account ID")')),(0,r.kt)("p",null,"The Subkey Tool's The\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/#inspecting-keys"},"Inspecting Keys"),"\nthe section explains how to use the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command to recalculate your key pair's public key and\naddress."),(0,r.kt)("p",null,"Start by inspecting your account's Polkadot address by running the inspect command against your\naccount's address:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ subkey inspect 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n\nPublic Key URI `1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F` is account:\n Network ID/version: polkadot\n Public key (hex): 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Account ID: 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n SS58 Address: 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n")),(0,r.kt)("p",null,'Take note of the hexadecimal string for "Public key (hex)". This is your account\'s public key.'),(0,r.kt)("p",null,"Running the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command on your public key along with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--public")," parameter the SS58\naddress for the default network (substrate) is returned."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ subkey inspect --public 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n\nNetwork ID/version: substrate\n Public key (hex): 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Account ID: 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Public key (SS58): 5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n SS58 Address: 5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n")),(0,r.kt)("p",null,"Using the ",(0,r.kt)("inlineCode",{parentName:"p"},"--network")," flag, you can define the network that you would like to inspect, where the\nSS58 address will be based on that network. Now, running the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command with\n",(0,r.kt)("inlineCode",{parentName:"p"},"--network polkadot")," return your original Polkadot address, thus verifying the public key."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ subkey inspect --network polkadot 5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n\nPublic Key URI `5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp` is account:\n Network ID/version: polkadot\n Public key (hex): 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Account ID: 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Public key (SS58): 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n SS58 Address: 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n")),(0,r.kt)("p",null,"You will notice that the Subkey Tool recognizes the correct address network and returns the\nassociated public key. The public key is returned as a hexadecimal string (i.e. prefixed with\n",(0,r.kt)("strong",{parentName:"p"},'"0x"'),"). ",(0,r.kt)("strong",{parentName:"p"},"For both SS58 addresses, the same public key is returned.")),(0,r.kt)("h4",{id:"address-verification"},"Address Verification"),(0,r.kt)("h5",{id:"consider-the-following-example"},"Consider the following example:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"19",src:a(2080).Z,width:"739",height:"543"})),(0,r.kt)("p",null,"If you are comfortable enough to distinguish between each account parameter, you can prefix the\npublic-key string with ",(0,r.kt)("strong",{parentName:"p"},'"0x"')," on your own:"),(0,r.kt)("p",null,"From:\n",(0,r.kt)("inlineCode",{parentName:"p"},"Pay DOTs to the Polkadot account:192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),',\nwe prefix the address by "0x" ->\n',(0,r.kt)("inlineCode",{parentName:"p"},"0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),"."),(0,r.kt)("p",null,"Using the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool"),', you can verify\nboth address associations to your public key. Copy your public key into the "Input Account or Public\nKey" textbox and click "Transform" at the bottom. On the right-hand side, the addresses for Polkadot\nand Substrate that are returned based on your public key should match the ones you inspected.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"20",src:a(81779).Z,width:"1505",height:"759"})),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You may have to scroll down to the bottom of the menu to find the Substrate address based on the\nmenu listings. You will notice that many networks that also use the same Substrate address.")),(0,r.kt)("p",null,"You can verify your public key verification by recalling that Polkadot addresses start with a '1',\nwhereas Substrate addresses generally start with a '5' (Kusama addresses start with a capital\nletter). See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#address-format"},"Addresses")," for more details."),(0,r.kt)("p",null,"Furthermore, the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts"},"Utility Scripts")," can be referenced for how\nthe verification is performed:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts/blob/master/src/misc/pubkeyToAddress.js"},"pubkeyToAddress.js"),"\ndemonstrates how a single public key interprets a Polkadot, Substrate, or Kusama address."),(0,r.kt)("h2",{id:"indices"},"Indices"),(0,r.kt)("p",null,"Polkadot addresses can have indices. An index\nis like a short and easy-to-remember version of an address. Claiming an index requires a deposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.indices.deposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"","\nthat is released when the index is cleared. Any index can be claimed if it is not taken by someone\nelse."),(0,r.kt)("p",null,"But what if an account gets reaped, as explained above? In that case, the index is emptied. In other\nwords, the slot frees up again, making it available for anyone to claim. It is possible to ",(0,r.kt)("em",{parentName:"p"},"freeze"),"\nan index and permanently assign it to an address. ",(0,r.kt)("strong",{parentName:"p"},"This action consumes a deposit, and the index\nwill be permanently bound to the address with no option to release it.")),(0,r.kt)("admonition",{title:"Lookup Account Index on-chain",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"When someone shares their account index, their actual account address on-chain can be looked up\nthrough Polkadot-JS Apps UI > Developer > Chain state > Storage and selecting state query on indices\npallet for the account corresponding to the index.")),(0,r.kt)("p",null,"Here is an example snapshot that shows how to lookup the corresponding account address of the\naccount index 1988 on\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend network (Polkadot Test Network)"),",\nusing Polkadot-JS Apps UI. The output shows the account address, deposit amount, and a boolean flag\nindicating whether this is claimed permanently."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"query account index",src:a(65610).Z,width:"2012",height:"998"})),(0,r.kt)("p",null,"Submit a ",(0,r.kt)("inlineCode",{parentName:"p"},"claim")," extrinsic to the ",(0,r.kt)("inlineCode",{parentName:"p"},"indices")," pallet to register an index. The easiest way to do this\nis via Polkadot-JS UI through the ",(0,r.kt)("em",{parentName:"p"},"Developer -> Extrinsics")," menu:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Indices extrinsics",src:a(38872).Z,width:"786",height:"386"})),(0,r.kt)("p",null,"To find available indices to claim on Polkadot or Kusama,\n",(0,r.kt)("a",{parentName:"p",href:"https://www.shawntabrizi.com/substrate-js-utilities/indices/"},"this helper tool may come in handy"),"."),(0,r.kt)("p",null,"For keeping the index permanently, you can follow up with a ",(0,r.kt)("inlineCode",{parentName:"p"},"freeze")," extrinsic as mentioned above."),(0,r.kt)("h2",{id:"using-ens-with-dotksm-accounts"},"Using ENS with DOT/KSM accounts"),(0,r.kt)("p",null,"ENS (Ethereum Name Service) is a distributed and open system of smart contracts on the Ethereum\nblockchain which allows users to claim domain names like ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth"),"."),(0,r.kt)("p",null,"The ENS is equivalent to a DNS (Domain Name System) domain. Instead, it offers a decentralized and\nsecure way to translate text via smart contracts. Supporting wallets can then allow senders to input\nENS domains instead of long and unwieldy addresses. This prevents phishing, fraud, and typos and\nadds a layer of usability to the regular wallet user experience."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You will need an ENS name and an Ethereum account with some ether to follow along with this guide.\nTo register an ENS name, visit the ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," or any number of subdomain\nregistrars like ",(0,r.kt)("a",{parentName:"p",href:"https://nameth.io"},"Nameth"),". Note that if you're using an older ENS name, you should\nmake sure you're using the\n",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/the-ethereum-name-service/ens-registry-migration-is-over-now-what-a-few-things-to-know-fb05f921872a"},"new resolver"),".\nVisiting the ENS App will warn you about this. You will also need some way to use your Ethereum\naddress - following this guide on a personal computer is recommended. Wallets like\n",(0,r.kt)("a",{parentName:"p",href:"https://frame.sh/"},"Frame")," and ",(0,r.kt)("a",{parentName:"p",href:"https://metamask.io"},"Metamask")," are safe and will make interacting\nwith the Ethereum blockchain through your browser very easy.")),(0,r.kt)("p",null,"Despite living on the Ethereum blockchain, the ENS system has multi-chain support. In this guide,\nyou'll go through the process of adding a KSM and DOT address to ENS. We cover both KSM and DOT to\nshow two different approaches."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"DOT can currently only be added using the Resolver method. KSM can be added through both methods are\ndescribed below.")),(0,r.kt)("p",null,"This guide is also available in video format ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/XKjZk-5_mQc"},"on YouTube"),"."),(0,r.kt)("h3",{id:"adding-via-the-ui"},"Adding via the UI"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," allows an ENS domain owner to inspect all records bound to\nthe domain, and to add new ones."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"bruno.eth domain name in the ENS application",src:a(51804).Z,width:"977",height:"842"})),(0,r.kt)("p",null,"In the example above, the domain ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth")," has an Ethereum and a Bitcoin address attached. Let's\nattach a KSM account. First, click the ",(0,r.kt)("inlineCode",{parentName:"p"},"[+]")," icon in the Records tab."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"The plus icon in the records tab",src:a(27038).Z,width:"951",height:"190"})),(0,r.kt)("p",null,'Then, pick "Other Addresses", "KSM", and input the Kusama address:'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Inputs needed to register a KSM address",src:a(95860).Z,width:"914",height:"224"})),(0,r.kt)("p",null,"After clicking Save, your Ethereum wallet will ask you to confirm a transaction. Once processed, the\nrecord will show up on the domain's page:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"KSM address now visible in bruno.eth records",src:a(91581).Z,width:"936",height:"367"})),(0,r.kt)("p",null,"The exact process applies to adding your DOT address."),(0,r.kt)("p",null,"Once the transaction is confirmed, your address will be bound to your ENS domain."),(0,r.kt)("h3",{id:"wallet-support"},"Wallet Support"),(0,r.kt)("p",null,"There is no wallet support for ENS names for either KSM or DOT at this time, but the crypto\naccounting and portfolio application ",(0,r.kt)("a",{parentName:"p",href:"https://rotki.com/"},"Rotki")," does support KSM ENS resolution."),(0,r.kt)("h3",{id:"relevant-links"},"Relevant links"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.ens.domains/"},"ENS docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/the-ethereum-name-service/ens-launches-multi-coin-support-15-wallets-to-integrate-92518ab20599"},"ENS Multi-chain announcement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/ensdomains/address-encoder"},"Address encoder")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://swolfeyes.github.io/ethereum-namehash-calculator/"},"Namehash calculator")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.shawntabrizi.com/substrate-js-utilities/"},"Address to pubkey converter"))),(0,r.kt)("h2",{id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another"},"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another"),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"This will overwrite existing accounts with the same pubkey on your new computer. This generally\nshould not make a difference (since it can still access the same account), but it might if you have\ne.g. an account that was stored externally in the extension on the old computer but was created\ndirectly in the browser on the new one.")),(0,r.kt)("p",null,"This has been tested on Brave and Chrome, but not other browsers."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Go to JavaScript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Type in the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"JSON.stringify(localStorage)\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Copy and paste the returned string to a text editor and save the file."),(0,r.kt)("li",{parentName:"ol"},"Check that the string you pasted begins and ends with a tick mark ('). If not, add one to the\nbeginning and end."),(0,r.kt)("li",{parentName:"ol"},"Save and send that file with the copied string to the new computer."),(0,r.kt)("li",{parentName:"ol"},"On the new computer, go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Open the Javascript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Set a variable raw equal to the string from the text file")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"raw = ... copy-pasted json from original computer ...\n")),(0,r.kt)("ol",{start:10},(0,r.kt)("li",{parentName:"ol"},"Run the following code on the console:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"accounts = JSON.parse(raw);\nfor (var key in accounts) {\n if (accounts.hasOwnProperty(key)) {\n val = JSON.stringify(accounts[key]).replace(/\\\\/g,'').slice(1,-1);\n console.log(key + \" -> \" + val);\n localStorage.setItem(key, val);\n }\n}\n")),(0,r.kt)("ol",{start:11},(0,r.kt)("li",{parentName:"ol"},"Refresh Polkadot-JS App browser and check the Accounts and Addresses pages. All of your accounts\nand addresses should now be available.")))}k.isMDXComponent=!0},38872:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/index-a2000a16d514f2136b303dd1d29a17f4.png"},2080:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-1-6dc18c2b04022519cc6dd0fb3af36f94.png"},81779:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-2-16f0cbc7db6ab6eb8248a05df94adc35.png"},65610:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/query-index-6db697cbe5e058388b830fee34bc4415.png"},51804:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/01-min-dd1b37ae350384f3941bf8f446ec0994.png"},27038:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},95860:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},91581:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/04-min-7eb9f3330355312efa81e47ffc75123b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ad762f86.51168990.js b/assets/js/ad762f86.51168990.js deleted file mode 100644 index e89d6b4cdcba..000000000000 --- a/assets/js/ad762f86.51168990.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7940],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),r=a(67294),s=a(87152),i=a(34200),d=a(67425);function l(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,d,l,c,p;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,d=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new s.U(r),e.next=21,i.G.create({provider:l});case 21:c=e.sent,(p=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return d=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return d=(d=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return e.abrupt("return",d);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,a,n){switch(t){case"humanReadable":(0,d.HumanReadable)(e,a,n);break;case"precise":(0,d.Precise)(e,a,n);break;case"blocksToDays":(0,d.BlocksToDays)(e,n);break;case"percentage":(0,d.Percentage)(e,n);break;case"arrayLength":(0,d.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,i=e.filter,d=void 0===i?void 0:i,c=(0,r.useState)(""),u=c[0],m=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==d?p(s.toString(),d,t,m):m(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,a,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==d?p(o,d,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},79569:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>d,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),s=a(47940),i=["components"],d={id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},l=void 0,c={unversionedId:"learn/learn-account-advanced",id:"learn/learn-account-advanced",title:"Polkadot Accounts In-Depth",description:"Advanced Concepts about Polkadot's Accounts.",source:"@site/../docs/learn/learn-account-advanced.md",sourceDirName:"learn",slug:"/learn-account-advanced",permalink:"/docs/learn-account-advanced",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-account-advanced.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1694979190,formattedLastUpdatedAt:"Sep 17, 2023",frontMatter:{id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},sidebar:"docs",previous:{title:"Advanced",permalink:"/docs/learn-advanced-index"},next:{title:"Advanced Staking Concepts",permalink:"/docs/learn-staking-advanced"}},p={},u=[{value:"Address Format",id:"address-format",level:2},{value:"Derivation Paths",id:"derivation-paths",level:2},{value:"Soft vs. Hard Derivation",id:"soft-vs-hard-derivation",level:3},{value:"For the Curious: How Prefixes Work",id:"for-the-curious-how-prefixes-work",level:2},{value:"System Accounts",id:"system-accounts",level:2},{value:"Portability",id:"portability",level:2},{value:"Address Conversion Tools",id:"address-conversion-tools",level:2},{value:"How to Verify a Public Key's Associated Address",id:"how-to-verify-a-public-keys-associated-address",level:3},{value:"Using Subkey to Retrieve Public Key from SS58 Address",id:"using-subkey-to-retrieve-public-key-from-ss58-address",level:4},{value:"Address Verification",id:"address-verification",level:4},{value:"Consider the following example:",id:"consider-the-following-example",level:5},{value:"Indices",id:"indices",level:2},{value:"Using ENS with DOT/KSM accounts",id:"using-ens-with-dotksm-accounts",level:2},{value:"Adding via the UI",id:"adding-via-the-ui",level:3},{value:"Wallet Support",id:"wallet-support",level:3},{value:"Relevant links",id:"relevant-links",level:3},{value:"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another",id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another",level:2}],m={toc:u},h="wrapper";function k(e){var t=e.components,d=(0,o.Z)(e,i);return(0,r.kt)(h,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"address-format"},"Address Format"),(0,r.kt)("p",null,"The address format used in Substrate-based chains is SS58. SS58 is a modification of Base-58-check\nfrom Bitcoin with some minor changes. Notably, the format contains an ",(0,r.kt)("em",{parentName:"p"},"address type")," prefix that\nidentifies an address belonging to a specific network."),(0,r.kt)("p",null,"For example:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"1"),"."),(0,r.kt)("li",{parentName:"ul"},"Kusama addresses always start with a capital letter, such as ",(0,r.kt)("strong",{parentName:"li"},"C, D, F, G, H, J"),"."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"5"),".")),(0,r.kt)("p",null,"These prefixes, including how to validate addresses, are embedded in the Substrate SS58 format.\nNever use regular expressions for address validation."),(0,r.kt)("p",null,"It's important to understand that different network formats are ",(0,r.kt)("strong",{parentName:"p"},"merely other representations of\nthe same public key in a private-public keypair")," generated by an address generation tool. As a\nresult, the addresses across Substrate-based chains are compatible if the format is converted\ncorrectly."),(0,r.kt)("p",null,"As of Runtime 28, the default ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts##address-format"},"address format")," is the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/primitives/runtime/src/multiaddress.rs"},(0,r.kt)("inlineCode",{parentName:"a"},"MultiAddress")),"\ntype."),(0,r.kt)("p",null,"This ",(0,r.kt)("inlineCode",{parentName:"p"},"enum")," is a multi-format address wrapper for on-chain accounts and allows us to describe\nPolkadot's default address format to represent many different address types. This includes ",(0,r.kt)("strong",{parentName:"p"},"20\nbyte"),", ",(0,r.kt)("strong",{parentName:"p"},"32 byte"),", and ",(0,r.kt)("strong",{parentName:"p"},"arbitrary raw byte")," variants. It also enhances the original\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#indices"},(0,r.kt)("inlineCode",{parentName:"a"},"indices"))," lookup."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Many wallets allow you to convert between formats. Stand-alone tools exist as well; you can find\nthem in the ",(0,r.kt)("a",{parentName:"p",href:"#address-conversion-tools"},"address conversion tools")," section.")),(0,r.kt)("h2",{id:"derivation-paths"},"Derivation Paths"),(0,r.kt)("p",null,"If you want to create and manage several accounts on the network using the same seed, you can use\nderivation paths. We can think of the derived accounts as child accounts of the root account created\nusing the original mnemonic seed phrase. Many\nPolkadot key generation tools support hard and\nsoft derivation. For instance, if you intend to create an account to be used on the\nPolkadot chain, you can derive a ",(0,r.kt)("strong",{parentName:"p"},"hard key"),"\nchild account using ",(0,r.kt)("strong",{parentName:"p"},"//")," after the mnemonic phrase."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very//0'\n")),(0,r.kt)("p",null,"and a ",(0,r.kt)("strong",{parentName:"p"},"soft key")," child account using ",(0,r.kt)("strong",{parentName:"p"},"/")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very/0'\n")),(0,r.kt)("p",null,"If you want to create another account using the Polkadot chain using the same seed, you can change\nthe number at the end of the string above. For example, ",(0,r.kt)("inlineCode",{parentName:"p"},"/1"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"/2"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"/3")," will create different\nderived accounts."),(0,r.kt)("p",null,"You can use any letters or numbers in the derivation path as long as they make sense to you; they do\nnot have to follow any specific pattern. You may combine multiple derivations in your path, as well.\nFor instance, ",(0,r.kt)("inlineCode",{parentName:"p"},"//bill//account//1")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//john/polkadot/initial")," are both valid. To recreate a\nderived account, you must know both the seed and the derivation path, so you should either use a\nwell-defined sequence (e.g. //0, //1, //2...) or be sure to write down any derivation paths you use."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"It is only possible to generate a derived account by knowing the derivation path.")),(0,r.kt)("p",null,"There is an additional type of derivation called password derivation. On Polkadot you can derive a\n",(0,r.kt)("strong",{parentName:"p"},"password key")," account using ",(0,r.kt)("strong",{parentName:"p"},"///")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very///0'\n")),(0,r.kt)("p",null,"In this type of derivation, if the mnemonic phrase leaks, accounts cannot be derived without the\ninitial password. In fact, for soft- and hard-derived accounts, if someone knows the mnemonic phrase\nand the derivation path, they will have access to your account. For password-derived accounts, the\npassword is applied on the derivation path. You can know the mnemonic phrase and the derivation\npath, but without the password, it is impossible to access the account. In mathematical terms, if we\nhave a ",(0,r.kt)("inlineCode",{parentName:"p"},"written derivation path")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),", we can calculate the ",(0,r.kt)("inlineCode",{parentName:"p"},"real derivation path")," as\n",(0,r.kt)("inlineCode",{parentName:"p"},"f(written derivation path, password)"),", where ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," is a function. We can then calculate the\n",(0,r.kt)("inlineCode",{parentName:"p"},"account key pair")," using ",(0,r.kt)("inlineCode",{parentName:"p"},"f(seed, real derivation path)"),". Unlike hard and soft derivations that can\nbe mixed, only a single password should be specified per derivation."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Password-derived account are as secure as the chosen password.")),(0,r.kt)("h3",{id:"soft-vs-hard-derivation"},"Soft vs. Hard Derivation"),(0,r.kt)("p",null,"A soft derivation allows someone to potentially \"go backward\u201d to figure out the initial account's\nprivate key if they know the derived account's private key. It is also possible to determine that\ndifferent accounts generated from the same seed are linked to that seed. A hard derivation path does\nnot allow either of these - even if you know a derived private key, it's not feasible to figure out\nthe private key of the root address, and it's impossible to prove that the first account is linked\nwith the second. These derivation methods have their use cases, given that the private keys for all\nthe derived accounts are fully secure. Unless you have a specific need for a soft derivation, it is\nrecommended to generate the account using a hard derivation path."),(0,r.kt)("p",null,"See the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"Subkey documentation")," for\ndetails and examples of derivation path formats. The Polkadot-JS Apps and Extension and Parity\nSigner support custom derivation paths using the same syntax as Subkey."),(0,r.kt)("p",null,"Some wallets will automatically add derivation paths to the end of the generated mnemonic phrase.\nThis will generate separate seeds for different paths, allowing separate signing keys with the same\nmnemonic, e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"//polkadot")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//kusama"),". Although you may\ncorrectly save the mnemonic phrase, using it in another wallet will generate the same addresses only\nif both wallets use the same derivation paths."),(0,r.kt)("p",null,"Polkadot and Kusama both have paths registered in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 registry"),"."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"You must have the ",(0,r.kt)("em",{parentName:"p"},"parent")," private key and the derivation path to arrive at the key for an address.\nOnly use custom derivation paths if you are comfortable with your knowledge of this topic.")),(0,r.kt)("h2",{id:"for-the-curious-how-prefixes-work"},"For the Curious: How Prefixes Work"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json"},"SS58 registry")," states\nthat:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000000b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"0")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Kusama (Polkadot Canary) has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000010b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"2")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate has ",(0,r.kt)("inlineCode",{parentName:"li"},"00101010b")," as the address type (",(0,r.kt)("inlineCode",{parentName:"li"},"42")," in decimal).")),(0,r.kt)("p",null,"Because the ",(0,r.kt)("inlineCode",{parentName:"p"},"Base58-check")," alphabet has no number 0, the lowest value is indeed 1. So ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000b")," is\n1 in Base58-check. If we try to\n",(0,r.kt)("a",{parentName:"p",href:"https://www.better-converter.com/Encoders-Decoders/Base58Check-to-Hexadecimal-Decoder"},"decode")," a\nPolkadot address like ",(0,r.kt)("inlineCode",{parentName:"p"},"1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg"),", the result is\n",(0,r.kt)("inlineCode",{parentName:"p"},"000aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b29d7"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"00"),",\nwhich is indeed ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000")," in binary and ",(0,r.kt)("inlineCode",{parentName:"p"},"0")," in decimal and thus matches the address type of\nPolkadot."),(0,r.kt)("p",null,"Let's take a look at Substrate addresses. If we decode\n",(0,r.kt)("inlineCode",{parentName:"p"},"5CK8D1sKNwF473wbuBP6NuhQfPaWUetNsWUNAAzVwTfxqjfr"),", we get\n",(0,r.kt)("inlineCode",{parentName:"p"},"2a0aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b77e5"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"2a"),"\nwhich when\n",(0,r.kt)("a",{parentName:"p",href:"https://www.rapidtables.com/convert/number/hex-to-decimal.html"},"converted from hex to decimal"),"\nis 42. 42 is ",(0,r.kt)("inlineCode",{parentName:"p"},"00101010")," in binary, just as the SS58 document states."),(0,r.kt)("p",null,"Finally, let's look at Kusama addresses. Decoding ",(0,r.kt)("inlineCode",{parentName:"p"},"CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp"),"\ngives us ",(0,r.kt)("inlineCode",{parentName:"p"},"020aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b0985")," with the first\nbyte being ",(0,r.kt)("inlineCode",{parentName:"p"},"02"),", just as specified. If we try a Kusama address that starts with a completely\ndifferent letter, like ",(0,r.kt)("inlineCode",{parentName:"p"},"J4iggBtsWsb61RemU2TDWDXTNHqHNfBSAkGvVZBtn1AJV1a"),", we still get ",(0,r.kt)("inlineCode",{parentName:"p"},"02")," as the\nfirst byte: ",(0,r.kt)("inlineCode",{parentName:"p"},"02f2d606a67f58fa0b3ad2b556195a0ef905676efd4e3ec62f8fa1b8461355f1142509"),". It seems\ncounterintuitive that some addresses always have the same prefix and others like Kusama can vary\nwildly, but it's just a quirk of Base58-check encoding."),(0,r.kt)("h2",{id:"system-accounts"},"System Accounts"),(0,r.kt)("p",null,"As the word suggests, system accounts are used by the system. They are used, for example, for the\ntreasury, crowdloans, and nomination pools. From the point of view of the runtime, these accounts\nare like any other account on-chain. These special system accounts are just public keys, with the\nprivate key being unknown (and unattainable). So, that means that only the pallet itself can\ninteract with this account. These accounts can never issue a signed\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics"},"extrinsic")," since they do not have a private key."),(0,r.kt)("admonition",{title:"Explore System Accounts",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Treasury account address - ",(0,r.kt)("inlineCode",{parentName:"p"},"13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB"),"",""),(0,r.kt)("p",{parentName:"admonition"},"You can view the existing system accounts on ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/account_list?role=module"},"Subscan"),".")),(0,r.kt)("p",null,'Let us take a look at how system accounts are generated under the hood. For instance, to generate\nthe treasury account, the raw bytes of the strings "modl" and "py/trsry" are combined to create the\n',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". For more information, check the post on Substrate StackExchange on\n",(0,r.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/536/how-do-treasury-accounts-compare-to-end-user-accounts-in-frame"},"Treasury accounts"),'.\nSimilarly, to generate the crowdloan account, the raw bytes of the strings "modl" and "py/cfund"\nalong with the fund index are combined to create the ',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". Similar logic applies to\nnomination pool and parachain accounts as well."),(0,r.kt)("h2",{id:"portability"},"Portability"),(0,r.kt)("p",null,"The above information brings us to portability: the ability to use a mnemonic phrase or seed across\nmultiple wallets. Portability depends on several factors:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Derivation path"),(0,r.kt)("li",{parentName:"ul"},"Mnemonic format"),(0,r.kt)("li",{parentName:"ul"},"Seed derivation"),(0,r.kt)("li",{parentName:"ul"},"Signature scheme")),(0,r.kt)("p",null,"To use the exact mnemonic across multiple wallets, ensure they follow compatible methods for\ngenerating keys and signing messages. If you are still looking for understandable documentation,\ncontact the project maintainers."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"}),(0,r.kt)("th",{parentName:"tr",align:"center"},"Mnemonic Format"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Derivation Path"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Seed Derivation"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Signature Support"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot{.js} Extension"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot-JS Apps"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Ledger"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP39"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP44","\u2020"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32","\u2021"),(0,r.kt)("td",{parentName:"tr",align:"center"},"ed25519","\xa7")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Subkey"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k1")))),(0,r.kt)("p",null,"*"," Ed25519 keys have ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-bip39"},"limited compatibility")," with\nBIP39."),(0,r.kt)("p",null,"\u2020"," ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 Registry")),(0,r.kt)("p",null,"\u2021"," Ed25519 and BIP32 based on\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/LedgerHQ/orakolo/blob/master/papers/Ed25519_BIP%20Final.pdf"},"Khovratovich")),(0,r.kt)("p",null,"\xa7"," Sr25519 planned"),(0,r.kt)("h2",{id:"address-conversion-tools"},"Address Conversion Tools"),(0,r.kt)("p",null,"You can use the tools below to convert any SS58 address for any network for use on different\nnetworks"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot-address-convertor.netlify.app/"},"simple address converter"))),(0,r.kt)("h3",{id:"how-to-verify-a-public-keys-associated-address"},"How to Verify a Public Key's Associated Address"),(0,r.kt)("p",null,"You can verify your public key's associated address through a series of inspection steps, where the\nkey is a base-16 (hexadecimal) address."),(0,r.kt)("h4",{id:"using-subkey-to-retrieve-public-key-from-ss58-address"},"Using Subkey to Retrieve Public Key from SS58 Address"),(0,r.kt)("p",null,"This is to showcase that the ",(0,r.kt)("strong",{parentName:"p"},'SS58 address is based on the public key (aka "Account ID")')),(0,r.kt)("p",null,"The Subkey Tool's The\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/#inspecting-keys"},"Inspecting Keys"),"\nthe section explains how to use the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command to recalculate your key pair's public key and\naddress."),(0,r.kt)("p",null,"Start by inspecting your account's Polkadot address by running the inspect command against your\naccount's address:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ subkey inspect 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n\nPublic Key URI `1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F` is account:\n Network ID/version: polkadot\n Public key (hex): 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Account ID: 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n SS58 Address: 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n")),(0,r.kt)("p",null,'Take note of the hexadecimal string for "Public key (hex)". This is your account\'s public key.'),(0,r.kt)("p",null,"Running the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command on your public key along with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--public")," parameter the SS58\naddress for the default network (substrate) is returned."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ subkey inspect --public 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n\nNetwork ID/version: substrate\n Public key (hex): 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Account ID: 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Public key (SS58): 5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n SS58 Address: 5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n")),(0,r.kt)("p",null,"Using the ",(0,r.kt)("inlineCode",{parentName:"p"},"--network")," flag, you can define the network that you would like to inspect, where the\nSS58 address will be based on that network. Now, running the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command with\n",(0,r.kt)("inlineCode",{parentName:"p"},"--network polkadot")," return your original Polkadot address, thus verifying the public key."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ subkey inspect --network polkadot 5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp\n\nPublic Key URI `5CdiCGvTEuzut954STAXRfL8Lazs3KCZa5LPpkPeqqJXdTHp` is account:\n Network ID/version: polkadot\n Public key (hex): 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Account ID: 0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce\n Public key (SS58): 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n SS58 Address: 1a1LcBX6hGPKg5aQ6DXZpAHCCzWjckhea4sz3P1PvL3oc4F\n")),(0,r.kt)("p",null,"You will notice that the Subkey Tool recognizes the correct address network and returns the\nassociated public key. The public key is returned as a hexadecimal string (i.e. prefixed with\n",(0,r.kt)("strong",{parentName:"p"},'"0x"'),"). ",(0,r.kt)("strong",{parentName:"p"},"For both SS58 addresses, the same public key is returned.")),(0,r.kt)("h4",{id:"address-verification"},"Address Verification"),(0,r.kt)("h5",{id:"consider-the-following-example"},"Consider the following example:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"19",src:a(2080).Z,width:"739",height:"543"})),(0,r.kt)("p",null,"If you are comfortable enough to distinguish between each account parameter, you can prefix the\npublic-key string with ",(0,r.kt)("strong",{parentName:"p"},'"0x"')," on your own:"),(0,r.kt)("p",null,"From:\n",(0,r.kt)("inlineCode",{parentName:"p"},"Pay DOTs to the Polkadot account:192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),',\nwe prefix the address by "0x" ->\n',(0,r.kt)("inlineCode",{parentName:"p"},"0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),"."),(0,r.kt)("p",null,"Using the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool"),', you can verify\nboth address associations to your public key. Copy your public key into the "Input Account or Public\nKey" textbox and click "Transform" at the bottom. On the right-hand side, the addresses for Polkadot\nand Substrate that are returned based on your public key should match the ones you inspected.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"20",src:a(81779).Z,width:"1505",height:"759"})),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You may have to scroll down to the bottom of the menu to find the Substrate address based on the\nmenu listings. You will notice that many networks that also use the same Substrate address.")),(0,r.kt)("p",null,"You can verify your public key verification by recalling that Polkadot addresses start with a '1',\nwhereas Substrate addresses generally start with a '5' (Kusama addresses start with a capital\nletter). See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#address-format"},"Addresses")," for more details."),(0,r.kt)("p",null,"Furthermore, the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts"},"Utility Scripts")," can be referenced for how\nthe verification is performed:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts/blob/master/src/misc/pubkeyToAddress.js"},"pubkeyToAddress.js"),"\ndemonstrates how a single public key interprets a Polkadot, Substrate, or Kusama address."),(0,r.kt)("h2",{id:"indices"},"Indices"),(0,r.kt)("p",null,"Polkadot addresses can have indices. An index\nis like a short and easy-to-remember version of an address. Claiming an index requires a deposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.indices.deposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"","\nthat is released when the index is cleared. Any index can be claimed if it is not taken by someone\nelse."),(0,r.kt)("p",null,"But what if an account gets reaped, as explained above? In that case, the index is emptied. In other\nwords, the slot frees up again, making it available for anyone to claim. It is possible to ",(0,r.kt)("em",{parentName:"p"},"freeze"),"\nan index and permanently assign it to an address. ",(0,r.kt)("strong",{parentName:"p"},"This action consumes a deposit, and the index\nwill be permanently bound to the address with no option to release it.")),(0,r.kt)("admonition",{title:"Lookup Account Index on-chain",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"When someone shares their account index, their actual account address on-chain can be looked up\nthrough Polkadot-JS Apps UI > Developer > Chain state > Storage and selecting state query on indices\npallet for the account corresponding to the index.")),(0,r.kt)("p",null,"Here is an example snapshot that shows how to lookup the corresponding account address of the\naccount index 1988 on\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend network (Polkadot Test Network)"),",\nusing Polkadot-JS Apps UI. The output shows the account address, deposit amount, and a boolean flag\nindicating whether this is claimed permanently."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"query account index",src:a(65610).Z,width:"2012",height:"998"})),(0,r.kt)("p",null,"Submit a ",(0,r.kt)("inlineCode",{parentName:"p"},"claim")," extrinsic to the ",(0,r.kt)("inlineCode",{parentName:"p"},"indices")," pallet to register an index. The easiest way to do this\nis via Polkadot-JS UI through the ",(0,r.kt)("em",{parentName:"p"},"Developer -> Extrinsics")," menu:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Indices extrinsics",src:a(38872).Z,width:"786",height:"386"})),(0,r.kt)("p",null,"To find available indices to claim on Polkadot or Kusama,\n",(0,r.kt)("a",{parentName:"p",href:"https://www.shawntabrizi.com/substrate-js-utilities/indices/"},"this helper tool may come in handy"),"."),(0,r.kt)("p",null,"For keeping the index permanently, you can follow up with a ",(0,r.kt)("inlineCode",{parentName:"p"},"freeze")," extrinsic as mentioned above."),(0,r.kt)("h2",{id:"using-ens-with-dotksm-accounts"},"Using ENS with DOT/KSM accounts"),(0,r.kt)("p",null,"ENS (Ethereum Name Service) is a distributed and open system of smart contracts on the Ethereum\nblockchain which allows users to claim domain names like ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth"),"."),(0,r.kt)("p",null,"The ENS is equivalent to a DNS (Domain Name System) domain. Instead, it offers a decentralized and\nsecure way to translate text via smart contracts. Supporting wallets can then allow senders to input\nENS domains instead of long and unwieldy addresses. This prevents phishing, fraud, and typos and\nadds a layer of usability to the regular wallet user experience."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You will need an ENS name and an Ethereum account with some ether to follow along with this guide.\nTo register an ENS name, visit the ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," or any number of subdomain\nregistrars like ",(0,r.kt)("a",{parentName:"p",href:"https://nameth.io"},"Nameth"),". Note that if you're using an older ENS name, you should\nmake sure you're using the\n",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/the-ethereum-name-service/ens-registry-migration-is-over-now-what-a-few-things-to-know-fb05f921872a"},"new resolver"),".\nVisiting the ENS App will warn you about this. You will also need some way to use your Ethereum\naddress - following this guide on a personal computer is recommended. Wallets like\n",(0,r.kt)("a",{parentName:"p",href:"https://frame.sh/"},"Frame")," and ",(0,r.kt)("a",{parentName:"p",href:"https://metamask.io"},"Metamask")," are safe and will make interacting\nwith the Ethereum blockchain through your browser very easy.")),(0,r.kt)("p",null,"Despite living on the Ethereum blockchain, the ENS system has multi-chain support. In this guide,\nyou'll go through the process of adding a KSM and DOT address to ENS. We cover both KSM and DOT to\nshow two different approaches."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"DOT can currently only be added using the Resolver method. KSM can be added through both methods are\ndescribed below.")),(0,r.kt)("p",null,"This guide is also available in video format ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/XKjZk-5_mQc"},"on YouTube"),"."),(0,r.kt)("h3",{id:"adding-via-the-ui"},"Adding via the UI"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," allows an ENS domain owner to inspect all records bound to\nthe domain, and to add new ones."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"bruno.eth domain name in the ENS application",src:a(51804).Z,width:"977",height:"842"})),(0,r.kt)("p",null,"In the example above, the domain ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth")," has an Ethereum and a Bitcoin address attached. Let's\nattach a KSM account. First, click the ",(0,r.kt)("inlineCode",{parentName:"p"},"[+]")," icon in the Records tab."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"The plus icon in the records tab",src:a(27038).Z,width:"951",height:"190"})),(0,r.kt)("p",null,'Then, pick "Other Addresses", "KSM", and input the Kusama address:'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Inputs needed to register a KSM address",src:a(95860).Z,width:"914",height:"224"})),(0,r.kt)("p",null,"After clicking Save, your Ethereum wallet will ask you to confirm a transaction. Once processed, the\nrecord will show up on the domain's page:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"KSM address now visible in bruno.eth records",src:a(91581).Z,width:"936",height:"367"})),(0,r.kt)("p",null,"The exact process applies to adding your DOT address."),(0,r.kt)("p",null,"Once the transaction is confirmed, your address will be bound to your ENS domain."),(0,r.kt)("h3",{id:"wallet-support"},"Wallet Support"),(0,r.kt)("p",null,"There is no wallet support for ENS names for either KSM or DOT at this time, but the crypto\naccounting and portfolio application ",(0,r.kt)("a",{parentName:"p",href:"https://rotki.com/"},"Rotki")," does support KSM ENS resolution."),(0,r.kt)("h3",{id:"relevant-links"},"Relevant links"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.ens.domains/"},"ENS docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/the-ethereum-name-service/ens-launches-multi-coin-support-15-wallets-to-integrate-92518ab20599"},"ENS Multi-chain announcement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/ensdomains/address-encoder"},"Address encoder")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://swolfeyes.github.io/ethereum-namehash-calculator/"},"Namehash calculator")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.shawntabrizi.com/substrate-js-utilities/"},"Address to pubkey converter"))),(0,r.kt)("h2",{id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another"},"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another"),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"This will overwrite existing accounts with the same pubkey on your new computer. This generally\nshould not make a difference (since it can still access the same account), but it might if you have\ne.g. an account that was stored externally in the extension on the old computer but was created\ndirectly in the browser on the new one.")),(0,r.kt)("p",null,"This has been tested on Brave and Chrome, but not other browsers."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Go to JavaScript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Type in the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"JSON.stringify(localStorage)\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Copy and paste the returned string to a text editor and save the file."),(0,r.kt)("li",{parentName:"ol"},"Check that the string you pasted begins and ends with a tick mark ('). If not, add one to the\nbeginning and end."),(0,r.kt)("li",{parentName:"ol"},"Save and send that file with the copied string to the new computer."),(0,r.kt)("li",{parentName:"ol"},"On the new computer, go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Open the Javascript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Set a variable raw equal to the string from the text file")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"raw = ... copy-pasted json from original computer ...\n")),(0,r.kt)("ol",{start:10},(0,r.kt)("li",{parentName:"ol"},"Run the following code on the console:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"accounts = JSON.parse(raw);\nfor (var key in accounts) {\n if (accounts.hasOwnProperty(key)) {\n val = JSON.stringify(accounts[key]).replace(/\\\\/g,'').slice(1,-1);\n console.log(key + \" -> \" + val);\n localStorage.setItem(key, val);\n }\n}\n")),(0,r.kt)("ol",{start:11},(0,r.kt)("li",{parentName:"ol"},"Refresh Polkadot-JS App browser and check the Accounts and Addresses pages. All of your accounts\nand addresses should now be available.")))}k.isMDXComponent=!0},38872:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/index-a2000a16d514f2136b303dd1d29a17f4.png"},2080:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-1-6dc18c2b04022519cc6dd0fb3af36f94.png"},81779:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-2-16f0cbc7db6ab6eb8248a05df94adc35.png"},65610:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/query-index-6db697cbe5e058388b830fee34bc4415.png"},51804:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/01-min-dd1b37ae350384f3941bf8f446ec0994.png"},27038:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},95860:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,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"},91581:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/04-min-7eb9f3330355312efa81e47ffc75123b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/cc44e8fd.7de880dc.js b/assets/js/cc44e8fd.7de880dc.js new file mode 100644 index 000000000000..8d9b40e128e3 --- /dev/null +++ b/assets/js/cc44e8fd.7de880dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7683],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||c[m]||r;return n?a.createElement(h,i(i({ref:t},d),{},{components:n})):a.createElement(h,i({ref:t},d))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var a=n(87462),o=n(63366),r=(n(67294),n(3905)),i=["components"],l={id:"build-node-management",title:"Node Management",sidebar_label:"Node Management",description:"Steps on how to manage your Polkadot node.",keywords:["node","management","deployment","operations","monitor"],slug:"../build-node-management"},s=void 0,p={unversionedId:"build/build-node-management",id:"build/build-node-management",title:"Node Management",description:"Steps on how to manage your Polkadot node.",source:"@site/../docs/build/build-node-management.md",sourceDirName:"build",slug:"/build-node-management",permalink:"/docs/build-node-management",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/build/build-node-management.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695017532,formattedLastUpdatedAt:"Sep 18, 2023",frontMatter:{id:"build-node-management",title:"Node Management",sidebar_label:"Node Management",description:"Steps on how to manage your Polkadot node.",keywords:["node","management","deployment","operations","monitor"],slug:"../build-node-management"},sidebar:"docs",previous:{title:"Integrating Assets",permalink:"/docs/build-integrate-assets"},next:{title:"Node Interaction",permalink:"/docs/build-node-interaction"}},d={},u=[{value:"Basic Node Operations",id:"basic-node-operations",level:2},{value:"File Structure",id:"file-structure",level:2},{value:"Monitoring and Telemetry",id:"monitoring-and-telemetry",level:2}],c={toc:u},m="wrapper";function h(e){var t=e.components,n=(0,o.Z)(e,i);return(0,r.kt)(m,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"This page contains basic information about running a Parity Polkadot client. There are a lot of ways\nto obtain/run a client, e.g. compiling from source, running in Docker, or downloading a binary. This\nguide will always refer to the executable as ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Always refer to the client's help ",(0,r.kt)("inlineCode",{parentName:"strong"},"polkadot --help")," for the most up-to-date information.")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"Other client implementation teams: Feel free to make a PR to this page with instructions (or a link\nto instructions) for your client.")),(0,r.kt)("p",null,"If you are trying to run a validator, refer to this tutorial\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"here"),"."),(0,r.kt)("h2",{id:"basic-node-operations"},"Basic Node Operations"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Selecting a chain")),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--chain ")," option to select the chain. Can be ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"kusama"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"westend"),",\n",(0,r.kt)("inlineCode",{parentName:"p"},"rococo"),", or a custom chain spec. By default, the client will start Polkadot. Watch\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=i9vNCHz6wO4"},"How a single codebase can power four different blockchains"),"\nto learn more about how the chain selection works internally."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Archive node")),(0,r.kt)("p",null,"An archive node does not prune any block or state data. Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--pruning archive")," flag. Certain\ntypes of nodes like validators must run in archive mode. Likewise, all\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-protocol-info/#events"},"events")," are cleared from state in each block, so if you want to\nstore events then you will need an archive node."),(0,r.kt)("admonition",{title:"Explainer video on upgrading a node",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"To upgrade a node, please refer to this\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=5LtcdBR9F40&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=5"},"video"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Exporting blocks")),(0,r.kt)("p",null,"To export blocks to a file, use ",(0,r.kt)("inlineCode",{parentName:"p"},"export-blocks"),". Export in JSON (default) or binary\n(",(0,r.kt)("inlineCode",{parentName:"p"},"--binary true"),")."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot export-blocks --from 0 \n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"RPC ports")),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-external")," flag to expose RPC ports. Not all RPC calls are safe to allow and you\nshould use an RPC proxy to filter unsafe calls. Select ports with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-port")," option. To limit\nthe hosts who can access, use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-cors")," option."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Execution")),(0,r.kt)("p",null,"The Parity Polkadot client implements a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-host"},"Polkadot Host")," and a\nnative runtime. The runtime must compile to WebAssembly and is stored on-chain. If the client's\nruntime is the same spec as the runtime that is stored on-chain, then the client will execute blocks\nusing the client binary. Otherwise, the client will execute the Wasm runtime from the chain."),(0,r.kt)("p",null,"Therefore, when syncing the chain, the client will execute blocks from past runtimes using their\nassociated Wasm binary. This feature also allows forkless upgrades: the client can execute a new\nruntime without updating the client."),(0,r.kt)("p",null,"Parity's Polkadot client has two Wasm execution methods, interpreted (default) and compiled. Set the\npreferred method to use when executing Wasm with ",(0,r.kt)("inlineCode",{parentName:"p"},"--wasm-execution "),". Compiled\nexecution will run much faster, especially when syncing the chain, but is experimental and may use\nmore memory/CPU. A reasonable tradeoff would be to sync the chain with compiled execution and then\nrestart the node with interpreted execution."),(0,r.kt)("h2",{id:"file-structure"},"File Structure"),(0,r.kt)("p",null,"The node stores a number of files in: ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/$USER/.local/share/polkadot/chains//"),". You\ncan set a custom path with ",(0,r.kt)("inlineCode",{parentName:"p"},"--base-path "),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},(0,r.kt)("inlineCode",{parentName:"strong"},"keystore"))),(0,r.kt)("p",null,"The keystore stores session keys, which are important for validator operations."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/learn-cryptography"},"Polkadot documentation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.substrate.io/main-docs/fundamentals/accounts-addresses-keys/#specialized-accounts"},"Substrate documentation"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},(0,r.kt)("inlineCode",{parentName:"strong"},"db"))),(0,r.kt)("p",null,"The database stores blocks and the state trie. If you are running a validator node, it also stores\nGRANDPA pre-votes and pre-commits and the offchain-worker DB. Use caution when\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-upgrade"},"migrating validator nodes")," to avoid equivocation. If\nyou want to start a new machine without resyncing, you can stop your node, back up the DB, and move\nit to a new machine."),(0,r.kt)("p",null,"To delete your DB and re-sync from genesis, run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot purge-chain\n")),(0,r.kt)("admonition",{title:"Validators should sync using the RocksDb backend",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"This is implicit by default, but can be explicit by passing the ",(0,r.kt)("inlineCode",{parentName:"p"},"--database RocksDb")," flag. In the\nfuture, it is recommended to switch to using the faster and more efficient ParityDb option.\nSwitching between database backends will require a resync."),(0,r.kt)("p",{parentName:"admonition"},"If you want to test out ParityDB you can add the flag ",(0,r.kt)("inlineCode",{parentName:"p"},"--database paritydb"),".")),(0,r.kt)("h2",{id:"monitoring-and-telemetry"},"Monitoring and Telemetry"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Node status")),(0,r.kt)("p",null,"You can check the node's health via RPC with\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/vi/websocat#installation"},"websocat"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'echo \'{"id":1,"jsonrpc":"2.0","method":"system_health","params":[]}\' | websocat -n1 -B 99999999 ws://127.0.0.1:9944\n\n{"jsonrpc":"2.0","result":{"peers":50,"isSyncing":false,"shouldHavePeers":true},"id":1}\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Logs")),(0,r.kt)("p",null,"The Polkadot client has a number of log targets. The most interesting to users may be:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"afg")," (Al's Finality Gadget - GRANDPA consensus)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"babe")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"telemetry")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"txpool")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"usage"))),(0,r.kt)("p",null,"Other targets include:\n",(0,r.kt)("inlineCode",{parentName:"p"},"db, gossip, peerset, state-db, state-trace, sub-libp2p, trie, wasm-executor, wasm-heap"),"."),(0,r.kt)("p",null,"The log levels, from least to most verbose, are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"error")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"warn")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"info")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"debug")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"trace"))),(0,r.kt)("p",null,"All targets are set to ",(0,r.kt)("inlineCode",{parentName:"p"},"info")," logging by default. You can adjust individual log levels using the\n",(0,r.kt)("inlineCode",{parentName:"p"},"--log (-l short)")," option, for example ",(0,r.kt)("inlineCode",{parentName:"p"},"-l afg=trace,sync=debug")," or globally with ",(0,r.kt)("inlineCode",{parentName:"p"},"-ldebug"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Telemetry & Metrics")),(0,r.kt)("p",null,"The Parity Polkadot client connects to telemetry by default. You can disable it with\n",(0,r.kt)("inlineCode",{parentName:"p"},"--no-telemetry"),", or connect only to specified telemetry servers with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--telemetry-url")," option\n(see the help options for instructions). Connecting to public telemetry may expose information that\nputs your node at higher risk of attack. You can run your own, private\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-telemetry"},"telemetry server")," or deploy a\n",(0,r.kt)("inlineCode",{parentName:"p"},"substrate-telemetry")," instance to a Kubernetes cluster using\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/substrate-telemetry-chart"},"this Helm chart"),"."),(0,r.kt)("p",null,"The node also exposes a Prometheus endpoint by default (disable with ",(0,r.kt)("inlineCode",{parentName:"p"},"--no-prometheus"),"). Substrate\nhas a\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/tutorials/get-started/monitor-node-metrics/"},"monitor node metrics tutorial"),"\nwhich uses this endpoint."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cc44e8fd.cea920b9.js b/assets/js/cc44e8fd.cea920b9.js deleted file mode 100644 index c35b575bfdf7..000000000000 --- a/assets/js/cc44e8fd.cea920b9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7683],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||c[m]||r;return n?a.createElement(h,i(i({ref:t},d),{},{components:n})):a.createElement(h,i({ref:t},d))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var a=n(87462),o=n(63366),r=(n(67294),n(3905)),i=["components"],l={id:"build-node-management",title:"Node Management",sidebar_label:"Node Management",description:"Steps on how to manage your Polkadot node.",keywords:["node","management","deployment","operations","monitor"],slug:"../build-node-management"},s=void 0,p={unversionedId:"build/build-node-management",id:"build/build-node-management",title:"Node Management",description:"Steps on how to manage your Polkadot node.",source:"@site/../docs/build/build-node-management.md",sourceDirName:"build",slug:"/build-node-management",permalink:"/docs/build-node-management",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/build/build-node-management.md",tags:[],version:"current",lastUpdatedBy:"Dominique",lastUpdatedAt:1694979058,formattedLastUpdatedAt:"Sep 17, 2023",frontMatter:{id:"build-node-management",title:"Node Management",sidebar_label:"Node Management",description:"Steps on how to manage your Polkadot node.",keywords:["node","management","deployment","operations","monitor"],slug:"../build-node-management"},sidebar:"docs",previous:{title:"Integrating Assets",permalink:"/docs/build-integrate-assets"},next:{title:"Node Interaction",permalink:"/docs/build-node-interaction"}},d={},u=[{value:"Basic Node Operations",id:"basic-node-operations",level:2},{value:"File Structure",id:"file-structure",level:2},{value:"Monitoring and Telemetry",id:"monitoring-and-telemetry",level:2}],c={toc:u},m="wrapper";function h(e){var t=e.components,n=(0,o.Z)(e,i);return(0,r.kt)(m,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"This page contains basic information about running a Parity Polkadot client. There are a lot of ways\nto obtain/run a client, e.g. compiling from source, running in Docker, or downloading a binary. This\nguide will always refer to the executable as ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Always refer to the client's help ",(0,r.kt)("inlineCode",{parentName:"strong"},"polkadot --help")," for the most up-to-date information.")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"Other client implementation teams: Feel free to make a PR to this page with instructions (or a link\nto instructions) for your client.")),(0,r.kt)("p",null,"If you are trying to run a validator, refer to this tutorial\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"here"),"."),(0,r.kt)("h2",{id:"basic-node-operations"},"Basic Node Operations"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Selecting a chain")),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--chain ")," option to select the chain. Can be ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"kusama"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"westend"),",\n",(0,r.kt)("inlineCode",{parentName:"p"},"rococo"),", or a custom chain spec. By default, the client will start Polkadot. Watch\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=i9vNCHz6wO4"},"How a single codebase can power four different blockchains"),"\nto learn more about how the chain selection works internally."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Archive node")),(0,r.kt)("p",null,"An archive node does not prune any block or state data. Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--pruning archive")," flag. Certain\ntypes of nodes like validators must run in archive mode. Likewise, all\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-protocol-info/#events"},"events")," are cleared from state in each block, so if you want to\nstore events then you will need an archive node."),(0,r.kt)("admonition",{title:"Explainer video on upgrading a node",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"To upgrade a node, please refer to this\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=5LtcdBR9F40&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=5"},"video"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Exporting blocks")),(0,r.kt)("p",null,"To export blocks to a file, use ",(0,r.kt)("inlineCode",{parentName:"p"},"export-blocks"),". Export in JSON (default) or binary\n(",(0,r.kt)("inlineCode",{parentName:"p"},"--binary true"),")."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot export-blocks --from 0 \n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"RPC ports")),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-external")," flag to expose RPC ports. Not all\nRPC calls are safe to allow and you should use an RPC proxy to filter unsafe calls. Select ports\nwith the ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-port")," option. To limit the hosts who can access, use the\n",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-cors")," option."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Execution")),(0,r.kt)("p",null,"The Parity Polkadot client implements a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-host"},"Polkadot Host")," and a\nnative runtime. The runtime must compile to WebAssembly and is stored on-chain. If the client's\nruntime is the same spec as the runtime that is stored on-chain, then the client will execute blocks\nusing the client binary. Otherwise, the client will execute the Wasm runtime from the chain."),(0,r.kt)("p",null,"Therefore, when syncing the chain, the client will execute blocks from past runtimes using their\nassociated Wasm binary. This feature also allows forkless upgrades: the client can execute a new\nruntime without updating the client."),(0,r.kt)("p",null,"Parity's Polkadot client has two Wasm execution methods, interpreted (default) and compiled. Set the\npreferred method to use when executing Wasm with ",(0,r.kt)("inlineCode",{parentName:"p"},"--wasm-execution "),". Compiled\nexecution will run much faster, especially when syncing the chain, but is experimental and may use\nmore memory/CPU. A reasonable tradeoff would be to sync the chain with compiled execution and then\nrestart the node with interpreted execution."),(0,r.kt)("h2",{id:"file-structure"},"File Structure"),(0,r.kt)("p",null,"The node stores a number of files in: ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/$USER/.local/share/polkadot/chains//"),". You\ncan set a custom path with ",(0,r.kt)("inlineCode",{parentName:"p"},"--base-path "),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},(0,r.kt)("inlineCode",{parentName:"strong"},"keystore"))),(0,r.kt)("p",null,"The keystore stores session keys, which are important for validator operations."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/learn-cryptography"},"Polkadot documentation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.substrate.io/main-docs/fundamentals/accounts-addresses-keys/#specialized-accounts"},"Substrate documentation"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},(0,r.kt)("inlineCode",{parentName:"strong"},"db"))),(0,r.kt)("p",null,"The database stores blocks and the state trie. If you are running a validator node, it also stores\nGRANDPA pre-votes and pre-commits and the offchain-worker DB. Use caution when\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-upgrade"},"migrating validator nodes")," to avoid equivocation. If\nyou want to start a new machine without resyncing, you can stop your node, back up the DB, and move\nit to a new machine."),(0,r.kt)("p",null,"To delete your DB and re-sync from genesis, run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot purge-chain\n")),(0,r.kt)("admonition",{title:"Validators should sync using the RocksDb backend",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"This is implicit by default, but can be explicit by passing the ",(0,r.kt)("inlineCode",{parentName:"p"},"--database RocksDb")," flag. In the\nfuture, it is recommended to switch to using the faster and more efficient ParityDb option.\nSwitching between database backends will require a resync."),(0,r.kt)("p",{parentName:"admonition"},"If you want to test out ParityDB you can add the flag ",(0,r.kt)("inlineCode",{parentName:"p"},"--database paritydb"),".")),(0,r.kt)("h2",{id:"monitoring-and-telemetry"},"Monitoring and Telemetry"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Node status")),(0,r.kt)("p",null,"You can check the node's health via RPC with\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/vi/websocat#installation"},"websocat"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'echo \'{"id":1,"jsonrpc":"2.0","method":"system_health","params":[]}\' | websocat -n1 -B 99999999 ws://127.0.0.1:9944\n\n{"jsonrpc":"2.0","result":{"peers":50,"isSyncing":false,"shouldHavePeers":true},"id":1}\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Logs")),(0,r.kt)("p",null,"The Polkadot client has a number of log targets. The most interesting to users may be:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"afg")," (Al's Finality Gadget - GRANDPA consensus)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"babe")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"telemetry")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"txpool")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"usage"))),(0,r.kt)("p",null,"Other targets include:\n",(0,r.kt)("inlineCode",{parentName:"p"},"db, gossip, peerset, state-db, state-trace, sub-libp2p, trie, wasm-executor, wasm-heap"),"."),(0,r.kt)("p",null,"The log levels, from least to most verbose, are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"error")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"warn")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"info")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"debug")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"trace"))),(0,r.kt)("p",null,"All targets are set to ",(0,r.kt)("inlineCode",{parentName:"p"},"info")," logging by default. You can adjust individual log levels using the\n",(0,r.kt)("inlineCode",{parentName:"p"},"--log (-l short)")," option, for example ",(0,r.kt)("inlineCode",{parentName:"p"},"-l afg=trace,sync=debug")," or globally with ",(0,r.kt)("inlineCode",{parentName:"p"},"-ldebug"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Telemetry & Metrics")),(0,r.kt)("p",null,"The Parity Polkadot client connects to telemetry by default. You can disable it with\n",(0,r.kt)("inlineCode",{parentName:"p"},"--no-telemetry"),", or connect only to specified telemetry servers with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--telemetry-url")," option\n(see the help options for instructions). Connecting to public telemetry may expose information that\nputs your node at higher risk of attack. You can run your own, private\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-telemetry"},"telemetry server")," or deploy a\n",(0,r.kt)("inlineCode",{parentName:"p"},"substrate-telemetry")," instance to a Kubernetes cluster using\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/substrate-telemetry-chart"},"this Helm chart"),"."),(0,r.kt)("p",null,"The node also exposes a Prometheus endpoint by default (disable with ",(0,r.kt)("inlineCode",{parentName:"p"},"--no-prometheus"),"). Substrate\nhas a\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/tutorials/get-started/monitor-node-metrics/"},"monitor node metrics tutorial"),"\nwhich uses this endpoint."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccc1222e.b0446c32.js b/assets/js/ccc1222e.b0446c32.js new file mode 100644 index 000000000000..027d431a0d8f --- /dev/null +++ b/assets/js/ccc1222e.b0446c32.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6920],{3905:(t,a,e)=>{e.d(a,{Zo:()=>m,kt:()=>k});var r=e(67294);function n(t,a,e){return a in t?Object.defineProperty(t,a,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[a]=e,t}function o(t,a){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable}))),e.push.apply(e,r)}return e}function i(t){for(var a=1;a=0||(n[e]=t[e]);return n}(t,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,e)&&(n[e]=t[e])}return n}var p=r.createContext({}),h=function(t){var a=r.useContext(p),e=a;return t&&(e="function"==typeof t?t(a):i(i({},a),t)),e},m=function(t){var a=h(t.components);return r.createElement(p.Provider,{value:a},t.children)},s="mdxType",d={inlineCode:"code",wrapper:function(t){var a=t.children;return r.createElement(r.Fragment,{},a)}},u=r.forwardRef((function(t,a){var e=t.components,n=t.mdxType,o=t.originalType,p=t.parentName,m=l(t,["components","mdxType","originalType","parentName"]),s=h(e),u=n,k=s["".concat(p,".").concat(u)]||s[u]||d[u]||o;return e?r.createElement(k,i(i({ref:a},m),{},{components:e})):r.createElement(k,i({ref:a},m))}));function k(t,a){var e=arguments,n=a&&a.mdxType;if("string"==typeof t||n){var o=e.length,i=new Array(o);i[0]=u;var l={};for(var p in a)hasOwnProperty.call(a,p)&&(l[p]=a[p]);l.originalType=t,l[s]="string"==typeof t?t:n,i[1]=l;for(var h=2;h{e.r(a),e.d(a,{assets:()=>m,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>h,toc:()=>s});var r=e(87462),n=e(63366),o=(e(67294),e(3905)),i=["components"],l={id:"build-open-source",title:"Open Source Stack",sidebar_label:"Open Source Stack",description:"Overview of the open source Polkadot/Kusama Tech Stack",keywords:["open","source","development","code","resources","tools","apis"],slug:"../build-open-source"},p="Open Source Polkadot Stack \x3c!-- omit in toc --\x3e",h={unversionedId:"build/build-open-source",id:"build/build-open-source",title:"Open Source Stack",description:"Overview of the open source Polkadot/Kusama Tech Stack",source:"@site/../docs/build/build-open-source.md",sourceDirName:"build",slug:"/build-open-source",permalink:"/docs/build-open-source",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/build/build-open-source.md",tags:[],version:"current",lastUpdatedBy:"S E R A Y A",lastUpdatedAt:1695061589,formattedLastUpdatedAt:"Sep 18, 2023",frontMatter:{id:"build-open-source",title:"Open Source Stack",sidebar_label:"Open Source Stack",description:"Overview of the open source Polkadot/Kusama Tech Stack",keywords:["open","source","development","code","resources","tools","apis"],slug:"../build-open-source"},sidebar:"docs",previous:{title:"Tool Index",permalink:"/docs/build-tools-index"},next:{title:"Hackathons",permalink:"/docs/build-hackathon"}},m={},s=[{value:"About",id:"about",level:2},{value:"Layers of Polkadot Stack",id:"layers-of-polkadot-stack",level:2},{value:"Wallets",id:"wallets",level:3},{value:"User Interface",id:"user-interface",level:3},{value:"Tools, APIs, and Languages",id:"tools-apis-and-languages",level:3},{value:"ink Smart Contracts",id:"ink-smart-contracts",level:3},{value:"Chains and Pallets",id:"chains-and-pallets",level:3},{value:"Host",id:"host",level:3},{value:"Network Maintenance Tools",id:"network-maintenance-tools",level:3},{value:"Signatures",id:"signatures",level:3},{value:"Consensus",id:"consensus",level:3},{value:"Networking",id:"networking",level:3},{value:"Primitives",id:"primitives",level:3},{value:"Contributing",id:"contributing",level:2}],d={toc:s},u="wrapper";function k(t){var a=t.components,e=(0,n.Z)(t,i);return(0,o.kt)(u,(0,r.Z)({},d,e,{components:a,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"open-source-polkadot-stack--omit-in-toc-"},"Open Source Polkadot Stack "),(0,o.kt)("admonition",{title:"Do your research before using open-source tools",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The tools listed here are open-source and are linked directly to their source code. Before using these tools to build your projects, always ",(0,o.kt)("a",{parentName:"p",href:"/docs/how-to-dyor"},"do your research")," and be aware of ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-scams"},"scams"),".")),(0,o.kt)("p",null,"The goal of this page is to provide an overview of the open-source Polkadot/Kusama Tech Stack."),(0,o.kt)("p",null,"This is a living document, and we are relying on our community to contribute to it and help maintain\nit. ",(0,o.kt)("a",{parentName:"p",href:"#contributing"},(0,o.kt)("strong",{parentName:"a"},"Please feel free to make edits and additions via pull requests")),". We\napologize if we missed your project!"),(0,o.kt)("hr",null),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#about"},"About")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#layers-of-polkadot-stack"},"Layers of Polkadot Stack"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#wallets"},"Wallets")," "),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#user-interface"},"User Interface")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#tools-apis-and-languages"},"Tools, APIs, and Languages")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#ink-smart-contracts"},"ink Smart Contracts")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#chains-and-pallets"},"Chains and Pallets")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#host"},"Host")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#network-maintenance-tools"},"Network Maintenance Tools")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#signatures"},"Signatures")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#consensus"},"Consensus")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#networking"},"Networking")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#primitives"},"Primitives")))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#contributing"},"Contributing"))),(0,o.kt)("h2",{id:"about"},"About"),(0,o.kt)("p",null,"The Polkadot Tech Stack is a subset of the Web 3.0 Tech Stack, which consists of the ",(0,o.kt)("strong",{parentName:"p"},"open-source"),"\ntechnologies contributing to and relying on ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/"},"Polkadot"),". It is meant to be used\nfor decentralized application (Dapp) development within numerous verticals, including DeFi, Gaming,\nProvenance and many others not pictured below."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"|------|--------|------------|\n| DeFi | Gaming | Provenance |\n|______|________|____________|\n Dapps\n|--------------------------/-|\n| Explorers, Wallets / |\n|------------------------/---|\n| Tools, Apis, Languages/ |\n|----------------------/-----|\n| 2nd layer protocols / |\n|--------------------/-------|\n| Chains / other |\n|------------------/--- --|\n| *Polkadot* | tech |\n|------------------\\---------|\n| P2P, Crypto, Wasm \\ |\n|--------------------\\-------|\n")),(0,o.kt)("h2",{id:"layers-of-polkadot-stack"},"Layers of Polkadot Stack"),(0,o.kt)("p",null,"In the below sections, you can find a list of different layers of the Polkadot Stack."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Maintenance Status"),":"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83d\udfe2 Actively maintained"),(0,o.kt)("li",{parentName:"ul"},"\ud83d\udfe1 Stale (no activity on the main branch for one month)"),(0,o.kt)("li",{parentName:"ul"},"\u26aa Unmaintained (no activity on the main branch for more than three months)")),(0,o.kt)("h3",{id:"wallets"},"Wallets"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Web Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/Multix"},"Multix")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkasafe/polkasafe-ui"},"Polkasafe")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/apps"},"polkadot-js/apps")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TalismanSociety/talisman-web"},"Talisman Web Application")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/enkryptcom/mydotwallet"},"mydotwallet")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dappforce/subid"},"Sub ID")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Primis-Labs/client"},"Primis")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3finance/sakura"},"Sakura")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/Web3Box-apps"},"Web3Box")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CoongCrafts/coong-wallet"},"Coong Wallet")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/subscan-multisig-react"},"Subscan Multisig UI - React")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/subscan-multisig-ui"},"Subscan Multisig UI")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DoraFactory/dorafactory-multisig"},"Dorafactory-Multisig")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/capi-multisig-app"},"Capi Multisig App")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"User-friendly Wallet based on the ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/frame/recovery"},"Recovery Pallet"),", Web wallets focused on user-onboarding (e.g. using ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/near/near-wallet"},"localStorage"),"), Enterprise Wallets")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Desktop Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/novasamatech/nova-spektr"},"nova-spektr")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/omni-desktop-prototype"},"Omni desktop")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Browser Extensions"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/TalismanSociety/talisman"},"Talisman-Extension")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Koniverse/SubWallet-Extension"},"SubWallet-Extension")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/enkryptcom/enKrypt"},"Enkrypt")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/extension"},"Polkadot{.js}")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Nick-1979/polkadot-Js-Plus-extension"},"Polkadot-Js-Plus-Extension")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainBridgeNetworkTeam/Doter"},"Doter")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/GetSpeckle/speckle-browser-extension"},"Speckle OS")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockcoders/kuma-wallet"},"Kuma Cross-chain Wallet")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Sign-in with your polkadot, kusama, etc. account.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Mobile Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/airgap-it/airgap-wallet"},"AirGap")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Koniverse/SubWallet-Mobile"},"SubWallet-Mobile")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/luniehq/lunie"},"Lunie")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkawallet-io/polkawallet-flutter"},"Polkawallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-signer"},"Parity Signer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/consenlabs/token-core"},"imToken")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/fearless-Android"},"Fearless Wallet Android")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/fearless-iOS"},"Fearless Wallet iOS")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stylo-app/stylo"},"Stylo")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nova-wallet/nova-utils"},"Nova Wallet")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/fractapp/fractapp/"},"Fractapp")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Interstellar-Network/wallet-app"},"Interstellar Network")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hypha-dao/hashed-wallet"},"Hashed Wallet")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Burner Wallets/Faucet/Gifts"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/hamidra/dotdrop"},"dotdrop")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/vue-polkadot/apps"},"KodaDot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/astar-faucet-bot"},"Astar Faucet Bot")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/karooolis/sybil-resistant-substrate-faucet"},"Generic sybil-resistant faucet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/StringNick/sybil-resistant-chat-bot-substrate-faucet"},"sybil-resistant Chat Bot Faucet")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"Faucet (a sybil-resistant way to receive free tokens)")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Wallet Plugins"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/metamask-snap-polkadot"},"Metamask-Snap by Chainsafe")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"CLI Wallet"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/yxf/subwallet"},"Subwallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/canontech/proxy-hot-wallet"},"Proxy-hot-wallet")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Hardware Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ZondaX/ledger-polkadot"},"Ledger Polkadot")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/ledger-kusama"},"Ledger Kusama")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/ledger-statemint"},"Ledger Statemint")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/ledger-statemine"},"Ledger Statemine")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Trezor")))),(0,o.kt)("h3",{id:"user-interface"},"User Interface"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Block Explorers"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/topmonks/calamar"},"Calamar")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/colorfulnotion/polkaholic"},"Polkaholic")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkascan/explorer-api"},"Polkascan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Colm3na/polkastats-backend"},"Polkastats")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/subscan"},"Subscan")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/statescan"},"Statescan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/edgeware-builders/edgscan"},"Edgscan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3labs/epirus-substrate"},"Sirato")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockcoders/ink-substrate-explorer-api"},"Ink! Explorer API")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/substats"},"Substats")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hybrid-explorer/hybrid-dapp"},"Hybrid Block Explorer")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"Mempool focused explorer (including parachain transaction)")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator Dashboards"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-telemetry"},"Polkadot Telemetry")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hashquark-io/polkacube-frontend"},"Polkacube")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/buidl-labs/YieldScan"},"YieldScan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-community/hubble/tree/master/app/controllers/polkadot"},"Hubble")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ArthurHoeke/cyclops"},"Cyclops")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3go-xyz/web3go-xyz-v2"},"Web3Go")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Node Explorers"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/protos-research/polkadot-node-explorer"},"Polkadot Node Explorer")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"NFT Explorer"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/kodadot/nft-gallery"},"NFT Explorer for Kusama & Polkadot")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Governance Dashboards"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/governance-ui"},"Polkadot Delegation Dashboard")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/premiurly/polkassembly"},"Polkassembly")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/dotreasury"},"dotreasury")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bright/bright-tresury"},"Bright Treasury")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/collaboration"},"OpenSquare offchain voting")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/wpank/open-gov-insights"},"OpenGov Insights")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"UI for the Kusama and/or Polkadot treasury (see ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/pull/5715"},"bounty module"),"), UI for Parachain Lease Offering (PLO)")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Staking"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/staking-rewards-collector"},"Staking Rewards Collector")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/jackson-harris-iii/staking-rewards-viewer"},"Staking Rewards Viewer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/cryptolab-network/polkadot-staking-site"},"Polkadot Staking Site")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-staking-dashboard"},"Polkadot Staking Dashboard")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/James-Sangalli/dot-validator-selector"},"Polkadot/Kusama Validator Selector")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/James-Sangalli/dot-staking-income"},"Staking Income CSV Generator")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Bridge UI"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-bridges-ui"},"Parity Bridges UI")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nutbox-dao/donut-interface"},"Donut Interface (Steem - Dot)")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Parachain/Crowdloan"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/jhonalino/parachains.network"},"Parachains.Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CrommVardek/polk-auction-ui"},"PolkAuction")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/10clouds/crowdloan-template"},"Crowdloan Front End Template")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hack-ink/slothunter/"},"Slothunter")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Identicon"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/RidOne-technologies/polkadot-web-identicon"},"PolkadotWebIdenticon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RidOne-technologies/polkadot-angular-identicon"},"Polkadot Angular IdentIcon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Noc2/Bird-Identicon"},"Bird Identicon")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/KappaSigmaMu/ksm-app"},"KappaSigmaMu Fratority")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAK-Foundation/quadratic-funding-webapp"},"Quadratic Funding Webapp")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://gitlab.com/polkawatch/polkawatch"},"Polkawatch"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bytepayment/bytepay"},"Bytepay")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Delmonicos/charging-management-platform"},"charging-management-platform")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TDSoftware/subidentity-webapp"},"subidentity-webapp")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/paid-qa/"},"OpenSquare Paid QA")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CrossChainLabs-DOT/dotpulse-api"},"DotPulse")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bsn-si/rubeus-smartcontract"},"Rubeus Keeper")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/justmert/eco-flow-frontend"},"Polkaflow")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/helikon-labs/chainviz-v1"},"ChainViz")," \u2754"),(0,o.kt)("td",{parentName:"tr",align:null},"Portfolio Viewer like Zapper or Zerion")))),(0,o.kt)("h3",{id:"tools-apis-and-languages"},"Tools, APIs, and Languages"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Runtime/Parachain frameworks"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-sdk"},"Polkadot Blockchain SDK")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/gosemble"},"Gosemble")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/subsembly"},"Subsembly")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/parachain-utilities"},"Parachain utilities")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gantree-io/gantree-core"},"Gantree")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"Tools to create parachains from frameworks used in other ecosystems")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Client Libraries"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/capi"},"Capi - Typescript")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kodadot/packages/tree/main/sub-api"},"sub-api")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/centrifuge/go-substrate-rpc-client"},"Go")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/polkadot_api_dotnet"},".Net")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ajuna-network/Ajuna.NetApi"},".NET Standard 2.0")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SubstrateGaming/Substrate.NET.Toolchain"},"Substrate .NET Toolchain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/polkadot_api_cpp"},"C++")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/finoabanking/substrate-c-tool"},"C")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/airalab/hs-web3"},"Haskell")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/api"},"Javascript")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-api-sidecar"},"Substrate API Sidecar - TypeScript")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkascan/py-substrate-interface"},"Python")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emeraldpay/polkaj"},"Java (+ Android)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/strategyobject/substrate-client-java"},"Substrate Client Java")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/scs/substrate-api-client"},"Rust SCS")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/subxt"},"Rust Parity (subxt)")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/trevor-crypto"},"Rust pdotc")," ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/php-substrate-api"},"PHP (gmajor-encrypt)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/neha0921/substrate-interface-package"},"PHP (neha0921)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/frontier"},"RPC-Ethereum")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tesseract-one/Substrate.swift"},"Swift")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NodleCode/substrate-client-kotlin"},"Kotlin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/substrate-client-kotlin"},"substrate-client-kotlin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/substrate-client-swift"},"substrate-client-swift")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rankanizer/polkadart"},"Dart")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polywrap/integrations"},"Substrate Core Polywrapper")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"RPC Gateway"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/subway"},"Subway")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Substrate Contract clients"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/go-patract"},"PatractGo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Easy Runtime Development"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/hack-ink/subalfred"},"Subalfred")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kaichaosun/substrate-stencil"},"substrate-stencil")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kaichaosun/play-substrate"},"Play Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/substrate-developer-hub/substrate-node-template"},"substrate-node-template")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-playground"},"Substrate Playground")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/as-substrate-runtime"},"AssemblyScript Runtime Generation")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/clearloop/sup"},"Substrate Package Manager")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/subsembly"},"Subsembly: Framework for developing AssemblyScript Substrate Runtimes")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bkchr/diener"},"dependency diener")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Easy Smart Contract Development"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/swankyhub/swanky-cli"},"Swanky-cli")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/727-ventures/typechain-polkadot"},"Typechain Polkadot")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/ink-playground"},"ink-playground")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/drink"},"DRink!")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockchain-it-hr/ink-remix-plugin"},"Ink! Remix Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/standardweb3/signac/"},"Signac")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/scio-labs/inkathon"},"INK!athon")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/avirajkhare00/ink-boxes/"},"ink!-boxes")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/avirajkhare00/ink-wizard"},"ink!-smart-contract-wizard")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/protofire/polkadot-contract-wizard"},"Polkadot Contract Wizard")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/ink-wrapper"},"ink-wrapper")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ink-analyzer/ink-vscode"},"ink! Analyzer for VS Code")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"IDE Plugins"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ink-analyzer/ink-analyzer"},"Ink! Analyzer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/vscode-substrate"},"Substrate Marketplace VS Code Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/everstake/vscode-plugin-substrate"},"VS Code Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/everstake/atom-plugin-substrate"},"Atom Code Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/zombienet-vscode-extension"},"zombienet extension")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Runtime/Pallet Security"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/srlabs/substrate-runtime-fuzzer"},"Substrate Runtime Fuzzer")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/shawntabrizi/substrate-toml-lint"},"Substrate Toml Lint")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kframework/wasm-semantics"},"K specifications")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSecurity/polpatrol"},"PolPatrol - Polkadot Runtime Checker")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"Automated Runtime checking tools, economic audit simulator such as ",(0,o.kt)("a",{parentName:"td",href:"https://gauntlet.network/"},"gauntlet.network"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Smart Contract Languages"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ask-lang/ask"},"Ask!")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/slickup/subscript"},"Subscript")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hyperledger-labs/solang"},"Solang")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/ink"},"Ink!")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/eigerco/pallet-move"},"pallet-move")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pontem-network/sp-move"},"Move VM Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/neatcoin/neatcoin"},"Move smart contract by Neatcoin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/727-Ventures/sol2ink"},"Sol2Ink")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pepyakin/substrate-seal-ebpf"},"eBPF Contracts Hackathon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/koute/polkavm"},"PolkaVM")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Functional Programming Languages, other languages with developed toolchains")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Smart Contract Security"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Brushfam/patron-backend/"},"Patron")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Testing"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-introspector"},"Polkadot introspector")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/subdirectory/subshell"},"Subshell")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polytope-labs/sc-simnode"},"substrate-simnode")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/halva-suite/halva"},"Halva")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/ink-waterfall"},"Ink Waterfall")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/redspot"},"Redspot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/mixbytes/tank"},"MixBytes Tank")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NikVolf/sub-flood"},"sub-flood")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-debug-kit"},"Substrate debug-kit")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/arijitAD/dotscale"},"Dotscale - SCALE Codec Comparator")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/JesseAbram/asset_cli_tool"},"Asset CLI tool")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/JesseAbram/unfinished_testing_tool"},"sub_crash")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chevdor/subwasm"},"subwasm")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ascjones/subsee"},"subsee")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-lab"},"polkadot-lab")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dwellir-public/rpc-perf/"},"RPC-perf")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Static Analysis"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/KaiserKarel/substrace"},"Substrace")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/simon-perriard/saft"},"Static analyzer for Substrate FRAME's pallets")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CoinFabrik/scout"},"CoinFabrik Scout")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Testnet"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/zombienet"},"Zombienet")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/chopsticks"},"Chopsticks")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-launch"},"Polkadot Launch")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/koute/polkadot-starship"},"polkadot-starship")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/maxsam4/fork-off-substrate"},"Fork off Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/try-runtime-cli"},"try-runtime-cli")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/parachain-launch"},"Parachain Launch")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zeeve-App/larch"},"Larch Zombienet GUI")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Benchmarking"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-sdk/tree/master/substrate/utils/frame/benchmarking-cli"},"Benchmarking CLI")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-stps"},"Polkadot sTPS")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/0xekez/clockchain"},"Clockchain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/shawntabrizi/substrate-graph-benchmarks"},"Substrate Graph Benchmarks")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Nikhil-Desai-Talentica/substrate-node-template-benchmarking"},"ink! & pallet benchmarking template")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/smart-bench"},"smart-bench")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Blockchain Indexing Engine"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/subsquid/squid-sdk"},"Squid SDK")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hybrid-explorer/hybrid-indexer"},"Hybrid Indexer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-archive"},"Substrate Archive")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/polkadot_psql_indexer"},"PSQL Indexer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/playzero/substrate-graph"},"Substrate Graph")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OnFinality-io/subql"},"Subquery")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/p2p-org/polkadot-profit-transformer"},"MBELT3")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kodadot/stick"},"stick")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Infra3-Network/hyperdot"},"Hyperdot")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Blockchain/Event Monitoring"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/guardian"},"Web3 Guardian")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/HugoByte/aurras-event-manager"},"Aurras Event Manager")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hicommonwealth/chain-events"},"@commonwealth/chain-events")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/massbitchain"},"Massbit")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kianenigma/polkadot-basic-notification"},"Polkadot Basic Notifications")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sodazone/ocelloids"},"Ocelloids")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TrackingChains/TrackingChain"},"Tracking Chain")," \ud83d\udfe2,"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Gaming"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/dodorare/crossbow"},"Crossbow")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://amethyst.rs/"},"Amethyst")," + ",(0,o.kt)("a",{parentName:"td",href:"https://substrate.dev/"},"Substrate"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"No-code Platforms"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/NovaBloq/Bubble-Plugin-Polkadot.js"},"EzCode's Polkadot.js plugin on Bubble.io")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Blackprint/nodes-polkadot.js"},"Blackprint Visual Programming Polkadot.js module")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/subrelay/interface"},"SubRelay")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/TalismanSociety/talisman-connect"},"Talisman Connect")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Koniverse/SubConnect"},"SubWallet-SubConnect")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nova-wallet/metadata-portal"},"Metadata Portal")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tesseract-one/Tesseract.rs"},"Tesseract")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/walletconnect-v2-monorepo"},"WalletConnect")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/BitGo/BitGoJS/tree/master"},"BitGoJS")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"XCM"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/trappist"},"Trappist")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/PureStake/xcm-tools"},"XCM-tools")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/substrate-api-rpc"},"XCM-tools Golang")," \ud83d\udfe2,",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paraspell/ui-v2"},"ParaSpell")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/t3rn/xbi"},"XBI")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockcoders/xcm-sdk"},"XCM TS/JS SDK")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/asset-transfer-api"},"asset-transfer-api")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/txwrapper-core"},"txwrapper-core")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/open-web3.js"},"open-web3 JS library")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CycanTech/GVM-Bridge"},"VM-Bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/srtool"},"srtool")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chevdor/srtool-cli"},"srtool-cli")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-tip-bot"},"Substrate Tip Bot")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/syntifi/ori"},"ORI (Onchain Risk Intelligence)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/albertov19/PolkaTools"},"PolkaTools")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-scripts"},"polkadot-scripts")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/virto-network/sube"},"Sube")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/data-store-sidecar"},"data-store-sidecar")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SugarFunge/sugarfunge-node"},"SugarFunge")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/second-state/substrate-wasmedge"},"substrate-wasmedge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/eightfish-org/eightfish"},"EightFish")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sandoxio/sandox"},"Sandox")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"ink-smart-contracts"},"ink Smart Contracts"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Bridges"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/dantenetwork/protocol-stack-for-ink"},"Dante Protocol")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DeFi"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/pendulum-chain/pendulum-ink-wrapper"},"Pendulum-Ink-Wrapper")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RottenKiwi/Panorama-Swap-INK-SC"},"Panorama Swap")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Juminstock/ink_bank"},"ink_bank")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/realnimish/polkadot-amm"},"Polkadot AMM")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/veradefi/defi"},"Vera")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nsure-tech/dot-contract"},"Nsure Insurance")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CycanTech/ELC"},"Everlasting Cash")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Coinversation/coinpro"},"Coinversation")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zenlinkpro/zenlink-dex-contract"},"zenlink-dex-contract")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ReserveLabs/AlgoCash"},"AlgoCash")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"New seigniorage-style stable coins")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Gaming"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/OpenEmojiBattler/open-emoji-battler"},"Open Emoji Battler")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/WiktorStarczewski/newomega.polkadot/blob/master/newomega_delegator/newomega/newomega.rs"},"NewOmega")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DAO"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/SyncraDAO/modular-dao"},"SyncraDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/subDAO-contracts"},"subDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RainbowcityFoundation/RainbowDAO-Protocol-Ink-milestone_1"},"RainbowDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Mangoboxlabs/Mangoboxink"},"MangoBox")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Mangoboxlabs/MangoSaleV2"},"MangoSale")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Identity/DID"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/TheDotflow"},"Dotflow")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Oracle"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/diadata-org/dia-wasm-oracle"},"DIA WASM Oracle")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Spam Protection"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/prosopo-io/integration"},"Prosopo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Tooling"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/h4nsu/openbrush-contracts"},"OpenBrush")," \u2754"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Governance"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/AbaxFinance/Governance"},"Abax Governance")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"NFT"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ArtZero-io/Contracts"},"ArtZero")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/swankyhub/magink-dapp"},"magink")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/ink-test-contracts"},"ink-test-contracts")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/agryaznov/candle-auction-ink"},"Candle Auctions")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SubDAO-Network/polkasign-contract"},"polkasign-contract")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bsn-si/ocex-cli"},"OCEX")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RoloiMoney/roloi-polkadot-w3f-grant"},"Roloi")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadrys/openPayroll"},"OpenPayroll")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/InkSmartContract/BlockchainFoodOrder"},"BlockchainFoodOrder")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"chains-and-pallets"},"Chains and Pallets"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Scalable Transactions"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/perun-network/perun-polkadot-pallet"},"Perun channels")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/perun-network/perun-polkadot-demo"},"CLI demo of Perun")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/Astar"},"Astar")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/celer-network/cChannel-substrate"},"Celer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/GunClear/Gunero"},"Gunclear")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/BCS-Labs/tpscore-etl-system"},"TPScore")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"roll-ups, DAG-based consensus mechanisms, side chains")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Bridges"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/interlay/interbtc"},"interBTC")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/webb-tools/dkg-substrate"},"DKG Substrate")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sygmaprotocol/sygma-substrate-pallets"},"Sygma")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bifrost-finance/bifrost-eos-relay"},"EOS by Bifrost")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-bridge"},"POA - Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/akropolisio/POC-polkadai-bridge"},"Substrate - Ethereum DAI Bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-bridge-relay"},"Substrate - Substrate Bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chainx-org/ChainX"},"BTC by ChainX")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChorusOne/wormhole-bridge"},"Cosmos-Substrate bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/octopus-network/substrate-ibc"},"Substrate IBC Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Snowfork/polkadot-ethereum"},"Polkadot Ethereum Bridge")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/darwinia-network/darwinia"},"Darwinia")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pendulum-chain/spacewalk"},"Spacewalk: a Stellar bridge")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/filecoindot"},"Filecoindot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/centrifuge/axelar-cgp-substrate/tree/main"},"Axelar-Substrate")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"ZCash")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Privacy"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LayerXcom/zero-chain"},"ZeroChain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/xx-labs/xxchain"},"xx network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Phala-Network/phala-blockchain"},"pLibra (Phala Network)")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/automata-network/automata"},"Automata Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zero-network/zero"},"Zero Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/appliedblockchain/silentdata-polkadot"},"Silent Data")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/anoma/masp"},"Multi-Asset Shielded Pool (MASP)")," , ",(0,o.kt)("a",{parentName:"td",href:"https://arxiv.org/pdf/2009.01020.pdf"},"Zkay"),", ",(0,o.kt)("a",{parentName:"td",href:"https://eprint.iacr.org/2018/962.pdf"},"Zexe"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"ZKP"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/zeropoolnetwork/zeropool-substrate-groth16-example"},"ZeroPool")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/megaclite"},"Megaclite")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/zkmega"},"zkMega")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/plonk"},"PLONK for Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/webb-tools/protocol-substrate"},"Webb Anchor Protocol")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bright/zk-snarks-with-substrate/"},"zk-SNARKs tutorial")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zkvers/substrate-zk"},"substrate-zk")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"TEE"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Acurast/acurast-core"},"Acurast")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/integritee-network/worker"},"Integritee")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/scs/substraTEE"},"substraTEE")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/keysafe-protocol/keysafe-app"},"Keysafe Protocol")," \u26aa")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DeFi"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/kapilsinha/privadex"},"PrivaDEX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/uinb/fusotao"},"Fusotao")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/reef-defi/reef-chain"},"Reef")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Diora-Network/Diora"},"Diora")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pendulum-chain/pendulum"},"Pendulum Chain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/compound-finance/gateway"},"Compound Gateway")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/parallel-finance/parallel"},"Parallel Finance")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/PINT"},"PINT")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/laminar-protocol/laminar-chain"},"Laminar Chain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/Acala"},"Acala")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/centrifuge/centrifuge-chain"},"Centrifuge")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stafiprotocol/stafi-node"},"Stafi")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/y2labs-0sh/definex"},"Definex")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAXFoundation/parrot"},"OAX Foundation")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/alexxuyang/substrate-dex"},"Cybex")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zenlinkpro/pallet-zenlink"},"Zenlink")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/lsaether/pallet-swaps"},"Swaps Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Polkadex-Substrate/Polkadex/tree/master"},"Polkadex")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/subdarkdex/subdex-parachain"},"SubDEX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/hack.HydraDX-node"},"HydraDX")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/apopiak/stablecoin"},"Substrate Stablecoin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/digitalnativeinc/standard-substrate"},"Standard protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sora-xor/sora2-network"},"Polkaswap")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/equilibrium-eosdt/equilibrium-curve-amm"},"Curve AMM")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/konomi-network/cumulus/"},"Konomi Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nutsfinance/stable-asset"},"Stable Asset")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/atscaletech/libra"},"Libra Payment")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/mangata-finance/mangata-node"},"Mangata")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tidelabs/tidechain"},"Tidechain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/Basilisk-node"},"Basilisk")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/PolymeshAssociation/Polymesh"},"Polymesh")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"DEX with privacy and confidentiality features such as those found in a ",(0,o.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/Dark_pool"},"dark pool"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Smart contract chains"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/PureStake/moonbeam"},"moonbeam")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/aleph-node"},"Aleph-node")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hicommonwealth/edgeware-node"},"Edgeware")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ParaState/substrate-ssvm-node"},"ParaState")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gear-tech/gear"},"gear")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/cennznet/cennznet"},"CENNZnet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/skyekiwi/skyekiwi-network"},"SkyeKiwi")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAK-Foundation/OAK-blockchain"},"OAK-blockchain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3labs/ice-substrate"},"ICE Blockchain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OmniBTC/PSC"},"Polkadot Smart Chain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/keep-starknet-strange/madara"},"Madara - Cairo/Starknet")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"smart contract chains with novel security approaches, smart contract chains based on existing toolchains")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Oracle"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/laminar-protocol/open-runtime-module-library/tree/master/oracle"},"Laminar")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/smartcontractkit/chainlink-polkadot"},"Chainlink-polkadot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/aresprotocols/ares"},"Ares Protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Kylin-Network/kylin-node"},"Kylin Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/interlay/interbtc-clients/tree/master/oracle"},"interbtc-clients oracle")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/webb-tools/anonima"},"Anonima")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SaaS3-Foundation/dRuntime-fat"},"SaaS3")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tellor-io/tellor-parachain-contracts"},"Tellor")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/diadata-org/bridgestate-ocw"},"Bridgestate Oracle")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Identity/DID"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/parami-foundation/parami-blockchain"},"Parami")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/litentry/litentry-parachain"},"Litentry")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/substrate-developer-hub/pallet-did"},"pallet-did")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/prasad-kumkar/dot-id"},"dot-id")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"IoT"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/NodleCode/chain"},"Nodle")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DataHighway-DHX/node"},"MXC/DataHighway")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/peaqnetwork/peaq-network-node"},"peaq-network-node")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Verifiable Claims"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/KILTprotocol/kilt-node"},"KILT")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/docknetwork/dock-substrate"},"Dock")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/fennelLabs/Fennel-Protocol"},"Fennel Protocol")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Supply chain"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/digicatapult/dscp-node"},"DSCP Node")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Health care"),(0,o.kt)("td",{parentName:"tr",align:null}),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Music Industry"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Allfeat/Allfeat"},"Allfeat Network")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Data Availability"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/availproject/avail"},"Avail")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ZeroDAO/melodot"},"Melodot")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Social Networking"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LibertyDSNP/frequency"},"Frequency")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/social-network/blockchain"},"Social Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dappforce/subsocial-parachain"},"SubSocial")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ZeroDAO/ZeroDAO-node"},"ZeroDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/myriadsocial/myriad-node"},"Myriad Node")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/randombishop/wika_etl"},"Wika Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LibertyDSNP/mrc"},"Project Liberty")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/listenofficial/listen-parachain"},"Listen")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tribal-protocol/tribal_contract"},"Tribal Protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rust-0x0/hex-space-protocol-substrate"},"Five Degrees on Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/acuity-social/acuity-substrate"},"Acuity Social")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"Private instant messenger that uses on-chain identity")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Governance/DAO"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/hashed-io/hashed-substrate"},"Hashed Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sunshine-protocol/sunshine-bounty"},"Sunshine DAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NucleiStudio/governance-os"},"Governance OS")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/idavollnetwork/idavoll"},"Idavoll Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DoraFactory/Substrate-Moloch-V2"},"Substrate Moloch")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Qrucial/QRUCIAL-DAO"},"QRUCIAL-DAO")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sctllabs/societal-node"},"Societal")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/daos-org/daos"},"DAOs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/amiyatulu/shivarthu/"},"Shivarthu")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/faterium"},"Faterium")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/decentration/apps"},"Supersig")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/deep-ink-ventures/genesis-dao-node"},"GenesisDAO")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dao-entrance/dao-entrance-node"},"DAO Entrance")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/liberland/liberland_substrate"},"Liberland")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/consul/consul"},"Consul")," - Open Government and E-Participation Web Software")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Prediction Markets and Futarchy"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/zeitgeistpm/zeitgeist"},"Zeitgeist")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/XPredictMarket/NodePredict"},"X Predict Market")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Messaging"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/validitylabs/HOPR-PL-Substrate"},"HOPR")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chainify/nolik"},"Nolik")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Uke-Messaging/uke-pallet"},"Uke")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Belsoft-rs/diffychat-pallet"},"Diffy Chat")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"File Storage, Cloud"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/dappforce/subsocial-offchain"},"Subsocial-Offchain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/playproject-io/datdot"},"DatDot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/crustio/crust"},"Crust Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rs-ipfs/offchain-ipfs-manual"},"offchain::ipfs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/canyon-network/canyon"},"Canyon Network")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cumulus2021/cess"},"CESS")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/cess-proving-system"},"CESS Proving Subsystem")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ideal-lab5/iris"},"Iris")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/fmd-cess"},"fmd-cess")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DanHenton/pocket-substrate/tree/ipfs-ocw"},"IPFS Frame V3")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/threefoldtech/tfchain"},"Threefold Chain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Apron-Network/apron-node"},"Apron")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TDSoftware/substrate-ipfs"},"IPFS Utilities")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Name Service"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/xaya/substrate-names"},"Substrate Names")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hskang9/substrate-name-service"},"ENS on Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pnsproject/pns-pallets"},"PNS-Pallets")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/HeisenbergLin22/Faceless_milestone2_delivery"},"Faceless")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ff13dfly/Anchor"},"Anchor")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Gaming"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/bit-country/Bit-Country-Blockchain"},"Bit.country")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SubGame-Network/subgame-network"},"SubGame")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/playzero/subzero"},"subzero")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3gamesofficial/web3games-blockchain"},"Web3Games")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ajuna-network/Ajuna"},"Ajuna Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/cryptoviet/gafi"},"Gafi Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://gitlab.com/asylum-space/asylum-item-nft"},"Asylum")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/3Dpass/3DP"},"3DPass")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polketio/toearnfun_flutter_app"},"Polket")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Computation/AI"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/DeepBrainChain/DeepBrainChain-MainChain"},"DeepBrain Chain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/anudit/cerebrum"},"AI Infrastructure on Blockchain")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Enable specific use-cases"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/airalab/substrate-node-robonomics"},"Robonomics")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/UniversalDot/pallets"},"UniversalDOT")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/EvercityEcosystem/evercity-chain"},"Evercity Sustainable Finance Protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/fennelLabs/Fennel-Protocol"},"Fennel Protocol")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/logion-network/logion-node"},"logion")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"NFT"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/capsule-corp-ternoa/chain"},"ternoa")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/danforbes/pallet-nft"},"FRAME Pallet: NFTs for Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/UniqueNetwork/unique-chain"},"Unique NFT Parachain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DNFT-Team/dnft-substrate-node/tree/master/pallets"},"DNFT")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rmrk-team/rmrk-substrate"},"RMRK-Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Popular-Coding/nt-nft"},"NT-NFTs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/GreenLemonProtocol/dksap-polkadot"},"Green Lemon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/Basilisk-node"},"Basilisk")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Randomness"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/substrate/tree/randomness-beacon"},"DKG and Randomness Beacon")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/random-meat/drand-substrate-client"},"drand-substrate-client")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Licensing"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/anagolay/anagolay-chain"},"Anagolay Network")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Banking Integration"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/element36-io/ebics-java-service"},"FIAT on-off-ramp")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Crowdfunding"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ImbueNetwork/imbue"},"Imbue Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zhangjiannan/QFgrant"},"Quadratic Funding pallet by Dora")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAK-Foundation/quadratic-funding-pallet/tree/master"},"Quadratic Funding pallet by OAK")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://ethresear.ch/t/minimal-anti-collusion-infrastructure/5413"},"Minimum Anti-Collusion Infrastructure (MACI)"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Collection of Pallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/open-runtime-module-library"},"Substrate Open Runtime Module Library")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/warehouse"},"warehouse")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/InvArch/InvArch-Frames"},"InvArch FRAME Pallet Library")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Marketplaces"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/WowLabz/dot-marketplace-v2/tree/Phase3_Milestone3"},"Dot Marketplace")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hashed-io/hashed-substrate/tree/main/pallets/gated-marketplace"},"Gated Marketplace")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Popular-Coding/ventur"},"Ventur")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Carbon Credits"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/bitgreen/bitg-node"},"BitGreen")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/EvercityEcosystem/carbon-assets"},"Carbon Assets Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SequesterChain/pallets"},"Sequester Pallets")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"UTXO"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Off-Narrative-Labs/Tuxedo"},"Tuxedo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Moonsong-Labs/moonkit"},"Moonkit")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gautamdhameja/substrate-account-filter"},"Substrate Account Filter")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opentensor/subtensor"},"Subtensor")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AdMetaNetwork/admeta"},"AdMeta")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chocolatenetwork/chocolate-node"},"Chocolate Node")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/virto-network/virto-node"},"Virto Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gautamdhameja/substrate-validator-set"},"Substrate Validator Set")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DEIPworld/deip-node"},"DEIP")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/debionetwork/debio-node"},"DeBio")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/mathwallet/MathChain"},"MathChain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/encointer/encointer-node"},"encointer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/grasslandnetwork/substrate_node"},"Grassland")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rusty-crewmates/substrate-tutorials"},"Substrate-Tutorials")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Fair-Squares/fair-squares"},"Fair Squares")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/totem-tech/totem"},"Totem Live Accounting")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/herou/EscrowPallet"},"Escrow Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NexTokenTech/TREX"},"TREX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/relationlabs/Relation-Graph"},"Relation Graph")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gertt/Invoice"},"Decentralized Invoice")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/redstone-network/redstone-node"},"Redstone Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/WunderbarNetwork/access-control"},"Access Control Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Omniverse-Web3-Labs/omniverse-swap/tree/web3-grant"},"Omniverse DLT")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polytope-labs/substrate-ismp"},"ISMP")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/xcmp_prototype_playground"},"XCMP")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dhiway/cord"},"CORD Chain")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Decentralized review/reputation system")))),(0,o.kt)("h3",{id:"host"},"Host"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Rust"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate"},"Substrate")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/cumulus"},"Cumulus")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"C++"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/kagome"},"Kagome")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/mayon"},"Mayon")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Go"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/gossamer"},"Gossamer")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Java"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/Fruzhin"},"Fruzhin")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/java-host-research"},"Java Host Research")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"AssemblyScript"),(0,o.kt)("td",{parentName:"tr",align:null}),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Light Client"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/smol-dot/smoldot"},"smoldot")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-connect"},"Substrate Connect")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/eqlabs/polkadot-light-client"},"C++ Polkadot Light Client")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Testing"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/polkadot-conformance"},"Polkadot Conformance")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sigp/polkafuzz"},"Polkafuzz")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"network-maintenance-tools"},"Network Maintenance Tools"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Secure validator setup"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkachu/polkadot-validator"},"Polkadot Validation Node Ansible Setup")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-validator-setup"},"W3F Polkadot Validator Setup")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Nexus2k/polkadot-ansible"},"polkadot-ansible")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"High availability setup"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/luguslabs/archipel"},"Archipel")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/protofire/polkadot-failover-mechanism"},"Polkadot Failover Mechanism")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Datagen-Project/Datagen-Substrate-Grant"},"Datagen")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bright/substrate-raft"},"High Availability Validator Setup")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Load Balanced Endpoints"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/insight-w3f/terragrunt-polkadot"},"terragrunt-polkadot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sudoblockio/substrate-meta"},"Geometry Labs' Substrate Meta repo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Deployment Tools"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Blockdaemon/bpm-sdk"},"Polkadot Package Manager")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/akropolisio/polkahub-monorepo"},"PolkaHub")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AvadoDServer/AVADO-DNP-Polkadot-custom"},"Avado")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-deployer"},"Polkadot Deployer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/for-parity-with-love/unified-collator-node-deployment"},"Unified Collator Deployment")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator monitoring"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/turboflakes/one-t"},"ONE-T")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/helikon-labs/subvt-backend"},"SubVT")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SimplyVC/panic"},"P.A.N.I.C.")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/polkalert"},"Polkalert")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nodebreaker0-0/substrate/tree/prometheus_v0.3"},"B-Harvest")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stakezone/nmonpolkadot"},"nmonpolkadot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ironoa/polkadot-k8s-monitor"},"Polkadot-K8s-Monitor")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-watcher"},"Polkadot-Watcher")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/helikon-labs/polkadot-kusama-1kv-telegram-bot"},"1KV Telegram Bot")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator payout management"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Colm3na/substrate-auto-payout"},"Substrate validator auto payout")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-payouts"},"Polkadot Payouts")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emostov/staking-payouts"},"staking-payouts CLI")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stakelink/substrate-payctl"},"Payctl")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/turboflakes/crunch"},"crunch")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Staking Miner"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/staking-miner-v2"},"Staking Miner v2")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Nominator Tools"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/miepsik/validators_selection"},"Validator Selection")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/filippoweb3/polkanalyzer"},"Polkanalyzer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/filippoweb3/polkanalyzer-app"},"Polkanalyzer-app")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"signatures"},"Signatures"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SR25519"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/schnorrkel"},"rust")," \ud83d\udfe2(contains partial bindings for C, JavaScript, and Python), ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gautamdhameja/sr25519-dotnet"},".Net bindings")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/sr25519"},"C")," \u26aa",(0,o.kt)("em",{parentName:"td"},"(old)"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TerenceGe/sr25519-donna"},"C")," \u26aa",(0,o.kt)("em",{parentName:"td"},"(new)"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/soramitsu-sr25519-crust"},"C/C++")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/sr25519_dotnet"},"C#")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/go-schnorrkel"},"Go")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/debuggor/schnorrkel-java"},"java")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/sr25519-bindings"},"PHP")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Signature Aggregation"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/apk-proofs"},"apk-proofs")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Distributed key generation (DKG) or management"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/isislovecruft/frost-dalek"},"keygen.rs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/sword"},"Secure Wallet Origin Distribution (SWORD)")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator HSMs"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/buildroot-zondax"},"Zondax Remote Signer")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"consensus"},"Consensus"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"PoC"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/subspace/substrate"},"Spartan")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"PoW"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/client/consensus/pow"},"PoW consensus for Substrate")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kulupu/kulupu/tree/master/pow"},"RandomX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/substrate-developer-hub/recipes/tree/master/consensus/sha3pow"},"Sha3 PoW")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Block production"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/client/consensus/babe"},"BABE")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/client/consensus/aura"},"Aura")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Finality"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/frame/grandpa"},"GRANDPA")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/AlephBFT"},"AlephBFT")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/PureStake/nimbus"},"Nimbus: Upgradeable consensus framework")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"networking"},"Networking"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCALE Codec"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-scale-codec"},"Rust")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-scale-codec-ts"},"TypeScript")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkascan/py-scale-codec"},"Python")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/gossamer/tree/development/pkg/scale/"},"Golang Chainsafe")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/scale.go"},"Golang Itering")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/MatthewDarnell/cScale"},"C")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/scale-codec-cpp"},"C++")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/api"},"JavaScript")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/as-scale-codec"},"AssemblyScript")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/airalab/hs-web3/tree/master/packages/scale/src/Codec"},"Haskell")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emeraldpay/polkaj"},"Java")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/scale.rb"},"Ruby")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nbltrust/dart-scale-codec"},"Dart")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tesseract-one/swift-scale-codec"},"Swift")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/scale-codec-swift"},"scale-codec-swift")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/scale-codec-kotlin"},"scale-codec-kotlin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/php-scale-codec"},"PHP")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/scale-codec-js-library"},"JavaScript by Soramitsu")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/scale-codec-comparator"},"Scale Codec Comparator")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/darwinia-network/darwinia-messages-sol/blob/master/contracts/utils/contracts/ScaleCodec.sol"},"ScaleCodec.sol by Darwinia")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Snowfork/snowbridge/blob/main/core/packages/contracts/contracts/ScaleCodec.sol"},"ScaleCodec.sol by Snowfork")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Networking Framework"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/libp2p/libp2p"},"libp2p")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DHT Crawler"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/atredispartners/dht-crawler-polkadot"},"Go")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emeraldpay/polkabot"},"Kotlin")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"RPC Tor-like access"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Evanesco-Labs/WhiteNoise.rs"},"WhiteNoise")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"primitives"},"Primitives"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Storage"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/frisitano/merkle-tree-db"},"Merkle Tree DB")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Merkle Proofs"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/polytope-labs/solidity-merkle-trees"},"Solidity Trie Verifier")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h2",{id:"contributing"},"Contributing"),(0,o.kt)("p",null,"Pull requests, issues, or other contributions from the community are encouraged! You can not only\nadd specific projects, but also potentially interesting fields/areas which are currently missing in\nthe tech stack."),(0,o.kt)("p",null,"\u2757 All technologies listed above need to be open-source. Ideally, the links\nlead directly to the code."),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Note: You will need a GitHub account to suggest changes or open issues. If you do not have one, you\nmay ",(0,o.kt)("a",{parentName:"em",href:"https://github.com/join"},"sign up for free"),".")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccc1222e.c6b123d5.js b/assets/js/ccc1222e.c6b123d5.js deleted file mode 100644 index 5286cecd8090..000000000000 --- a/assets/js/ccc1222e.c6b123d5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6920],{3905:(t,a,e)=>{e.d(a,{Zo:()=>m,kt:()=>k});var r=e(67294);function n(t,a,e){return a in t?Object.defineProperty(t,a,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[a]=e,t}function o(t,a){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable}))),e.push.apply(e,r)}return e}function i(t){for(var a=1;a=0||(n[e]=t[e]);return n}(t,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,e)&&(n[e]=t[e])}return n}var p=r.createContext({}),h=function(t){var a=r.useContext(p),e=a;return t&&(e="function"==typeof t?t(a):i(i({},a),t)),e},m=function(t){var a=h(t.components);return r.createElement(p.Provider,{value:a},t.children)},s="mdxType",d={inlineCode:"code",wrapper:function(t){var a=t.children;return r.createElement(r.Fragment,{},a)}},u=r.forwardRef((function(t,a){var e=t.components,n=t.mdxType,o=t.originalType,p=t.parentName,m=l(t,["components","mdxType","originalType","parentName"]),s=h(e),u=n,k=s["".concat(p,".").concat(u)]||s[u]||d[u]||o;return e?r.createElement(k,i(i({ref:a},m),{},{components:e})):r.createElement(k,i({ref:a},m))}));function k(t,a){var e=arguments,n=a&&a.mdxType;if("string"==typeof t||n){var o=e.length,i=new Array(o);i[0]=u;var l={};for(var p in a)hasOwnProperty.call(a,p)&&(l[p]=a[p]);l.originalType=t,l[s]="string"==typeof t?t:n,i[1]=l;for(var h=2;h{e.r(a),e.d(a,{assets:()=>m,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>h,toc:()=>s});var r=e(87462),n=e(63366),o=(e(67294),e(3905)),i=["components"],l={id:"build-open-source",title:"Open Source Stack",sidebar_label:"Open Source Stack",description:"Overview of the open source Polkadot/Kusama Tech Stack",keywords:["open","source","development","code","resources","tools","apis"],slug:"../build-open-source"},p="Open Source Polkadot Stack \x3c!-- omit in toc --\x3e",h={unversionedId:"build/build-open-source",id:"build/build-open-source",title:"Open Source Stack",description:"Overview of the open source Polkadot/Kusama Tech Stack",source:"@site/../docs/build/build-open-source.md",sourceDirName:"build",slug:"/build-open-source",permalink:"/docs/build-open-source",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/build/build-open-source.md",tags:[],version:"current",lastUpdatedBy:"David Hawig",lastUpdatedAt:1694978726,formattedLastUpdatedAt:"Sep 17, 2023",frontMatter:{id:"build-open-source",title:"Open Source Stack",sidebar_label:"Open Source Stack",description:"Overview of the open source Polkadot/Kusama Tech Stack",keywords:["open","source","development","code","resources","tools","apis"],slug:"../build-open-source"},sidebar:"docs",previous:{title:"Tool Index",permalink:"/docs/build-tools-index"},next:{title:"Hackathons",permalink:"/docs/build-hackathon"}},m={},s=[{value:"About",id:"about",level:2},{value:"Layers of Polkadot Stack",id:"layers-of-polkadot-stack",level:2},{value:"Wallets",id:"wallets",level:3},{value:"User Interface",id:"user-interface",level:3},{value:"Tools, APIs, and Languages",id:"tools-apis-and-languages",level:3},{value:"ink Smart Contracts",id:"ink-smart-contracts",level:3},{value:"Chains and Pallets",id:"chains-and-pallets",level:3},{value:"Host",id:"host",level:3},{value:"Network Maintenance Tools",id:"network-maintenance-tools",level:3},{value:"Signatures",id:"signatures",level:3},{value:"Consensus",id:"consensus",level:3},{value:"Networking",id:"networking",level:3},{value:"Primitives",id:"primitives",level:3},{value:"Contributing",id:"contributing",level:2}],d={toc:s},u="wrapper";function k(t){var a=t.components,e=(0,n.Z)(t,i);return(0,o.kt)(u,(0,r.Z)({},d,e,{components:a,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"open-source-polkadot-stack--omit-in-toc-"},"Open Source Polkadot Stack "),(0,o.kt)("admonition",{title:"Do your research before using open-source tools",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The tools listed here are open-source and are linked directly to their source code. Before using these tools to build your projects, always ",(0,o.kt)("a",{parentName:"p",href:"/docs/how-to-dyor"},"do your research")," and be aware of ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-scams"},"scams"),".")),(0,o.kt)("p",null,"The goal of this page is to provide an overview of the open-source Polkadot/Kusama Tech Stack."),(0,o.kt)("p",null,"This is a living document, and we are relying on our community to contribute to it and help maintain\nit. ",(0,o.kt)("a",{parentName:"p",href:"#contributing"},(0,o.kt)("strong",{parentName:"a"},"Please feel free to make edits and additions via pull requests")),". We\napologize if we missed your project!"),(0,o.kt)("hr",null),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#about"},"About")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#layers-of-polkadot-stack"},"Layers of Polkadot Stack"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#wallets"},"Wallets")," "),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#user-interface"},"User Interface")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#tools-apis-and-languages"},"Tools, APIs, and Languages")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#ink-smart-contracts"},"ink Smart Contracts")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#chains-and-pallets"},"Chains and Pallets")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#host"},"Host")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#network-maintenance-tools"},"Network Maintenance Tools")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#signatures"},"Signatures")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#consensus"},"Consensus")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#networking"},"Networking")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#primitives"},"Primitives")))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"#contributing"},"Contributing"))),(0,o.kt)("h2",{id:"about"},"About"),(0,o.kt)("p",null,"The Polkadot Tech Stack is a subset of the Web 3.0 Tech Stack, which consists of the ",(0,o.kt)("strong",{parentName:"p"},"open-source"),"\ntechnologies contributing to and relying on ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/"},"Polkadot"),". It is meant to be used\nfor decentralized application (Dapp) development within numerous verticals, including DeFi, Gaming,\nProvenance and many others not pictured below."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"|------|--------|------------|\n| DeFi | Gaming | Provenance |\n|______|________|____________|\n Dapps\n|--------------------------/-|\n| Explorers, Wallets / |\n|------------------------/---|\n| Tools, Apis, Languages/ |\n|----------------------/-----|\n| 2nd layer protocols / |\n|--------------------/-------|\n| Chains / other |\n|------------------/--- --|\n| *Polkadot* | tech |\n|------------------\\---------|\n| P2P, Crypto, Wasm \\ |\n|--------------------\\-------|\n")),(0,o.kt)("h2",{id:"layers-of-polkadot-stack"},"Layers of Polkadot Stack"),(0,o.kt)("p",null,"In the below sections, you can find a list of different layers of the Polkadot Stack."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Maintenance Status"),":"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83d\udfe2 Actively maintained"),(0,o.kt)("li",{parentName:"ul"},"\ud83d\udfe1 Stale (no activity on the main branch for one month)"),(0,o.kt)("li",{parentName:"ul"},"\u26aa Unmaintained (no activity on the main branch for more than three months)")),(0,o.kt)("h3",{id:"wallets"},"Wallets"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Web Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/Multix"},"Multix")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkasafe/polkasafe-ui"},"Polkasafe")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/apps"},"polkadot-js/apps")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TalismanSociety/talisman-web"},"Talisman Web Application")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/enkryptcom/mydotwallet"},"mydotwallet")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dappforce/subid"},"Sub ID")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Primis-Labs/client"},"Primis")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3finance/sakura"},"Sakura")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/Web3Box-apps"},"Web3Box")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CoongCrafts/coong-wallet"},"Coong Wallet")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/subscan-multisig-react"},"Subscan Multisig UI - React")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/subscan-multisig-ui"},"Subscan Multisig UI")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DoraFactory/dorafactory-multisig"},"Dorafactory-Multisig")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/capi-multisig-app"},"Capi Multisig App")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"User-friendly Wallet based on the ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/frame/recovery"},"Recovery Pallet"),", Web wallets focused on user-onboarding (e.g. using ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/near/near-wallet"},"localStorage"),"), Enterprise Wallets")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Desktop Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/novasamatech/nova-spektr"},"nova-spektr")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/omni-desktop-prototype"},"Omni desktop")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Browser Extensions"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/TalismanSociety/talisman"},"Talisman-Extension")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Koniverse/SubWallet-Extension"},"SubWallet-Extension")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/enkryptcom/enKrypt"},"Enkrypt")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/extension"},"Polkadot{.js}")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Nick-1979/polkadot-Js-Plus-extension"},"Polkadot-Js-Plus-Extension")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainBridgeNetworkTeam/Doter"},"Doter")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/GetSpeckle/speckle-browser-extension"},"Speckle OS")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockcoders/kuma-wallet"},"Kuma Cross-chain Wallet")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Sign-in with your polkadot, kusama, etc. account.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Mobile Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/airgap-it/airgap-wallet"},"AirGap")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Koniverse/SubWallet-Mobile"},"SubWallet-Mobile")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/luniehq/lunie"},"Lunie")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkawallet-io/polkawallet-flutter"},"Polkawallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-signer"},"Parity Signer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/consenlabs/token-core"},"imToken")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/fearless-Android"},"Fearless Wallet Android")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/fearless-iOS"},"Fearless Wallet iOS")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stylo-app/stylo"},"Stylo")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nova-wallet/nova-utils"},"Nova Wallet")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/fractapp/fractapp/"},"Fractapp")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Interstellar-Network/wallet-app"},"Interstellar Network")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hypha-dao/hashed-wallet"},"Hashed Wallet")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Burner Wallets/Faucet/Gifts"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/hamidra/dotdrop"},"dotdrop")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/vue-polkadot/apps"},"KodaDot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/astar-faucet-bot"},"Astar Faucet Bot")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/karooolis/sybil-resistant-substrate-faucet"},"Generic sybil-resistant faucet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/StringNick/sybil-resistant-chat-bot-substrate-faucet"},"sybil-resistant Chat Bot Faucet")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"Faucet (a sybil-resistant way to receive free tokens)")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Wallet Plugins"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/metamask-snap-polkadot"},"Metamask-Snap by Chainsafe")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"CLI Wallet"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/yxf/subwallet"},"Subwallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/canontech/proxy-hot-wallet"},"Proxy-hot-wallet")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Hardware Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ZondaX/ledger-polkadot"},"Ledger Polkadot")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/ledger-kusama"},"Ledger Kusama")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/ledger-statemint"},"Ledger Statemint")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/ledger-statemine"},"Ledger Statemine")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Trezor")))),(0,o.kt)("h3",{id:"user-interface"},"User Interface"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Block Explorers"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/topmonks/calamar"},"Calamar")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/colorfulnotion/polkaholic"},"Polkaholic")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkascan/explorer-api"},"Polkascan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Colm3na/polkastats-backend"},"Polkastats")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/subscan"},"Subscan")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/statescan"},"Statescan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/edgeware-builders/edgscan"},"Edgscan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3labs/epirus-substrate"},"Sirato")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockcoders/ink-substrate-explorer-api"},"Ink! Explorer API")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/substats"},"Substats")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hybrid-explorer/hybrid-dapp"},"Hybrid Block Explorer")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"Mempool focused explorer (including parachain transaction)")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator Dashboards"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-telemetry"},"Polkadot Telemetry")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hashquark-io/polkacube-frontend"},"Polkacube")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/buidl-labs/YieldScan"},"YieldScan")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-community/hubble/tree/master/app/controllers/polkadot"},"Hubble")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ArthurHoeke/cyclops"},"Cyclops")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3go-xyz/web3go-xyz-v2"},"Web3Go")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Node Explorers"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/protos-research/polkadot-node-explorer"},"Polkadot Node Explorer")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"NFT Explorer"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/kodadot/nft-gallery"},"NFT Explorer for Kusama & Polkadot")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Governance Dashboards"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/governance-ui"},"Polkadot Delegation Dashboard")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/premiurly/polkassembly"},"Polkassembly")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/dotreasury"},"dotreasury")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bright/bright-tresury"},"Bright Treasury")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/collaboration"},"OpenSquare offchain voting")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/wpank/open-gov-insights"},"OpenGov Insights")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"UI for the Kusama and/or Polkadot treasury (see ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/pull/5715"},"bounty module"),"), UI for Parachain Lease Offering (PLO)")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Staking"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/staking-rewards-collector"},"Staking Rewards Collector")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/jackson-harris-iii/staking-rewards-viewer"},"Staking Rewards Viewer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/cryptolab-network/polkadot-staking-site"},"Polkadot Staking Site")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-staking-dashboard"},"Polkadot Staking Dashboard")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/James-Sangalli/dot-validator-selector"},"Polkadot/Kusama Validator Selector")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/James-Sangalli/dot-staking-income"},"Staking Income CSV Generator")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Bridge UI"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-bridges-ui"},"Parity Bridges UI")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nutbox-dao/donut-interface"},"Donut Interface (Steem - Dot)")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Parachain/Crowdloan"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/jhonalino/parachains.network"},"Parachains.Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CrommVardek/polk-auction-ui"},"PolkAuction")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/10clouds/crowdloan-template"},"Crowdloan Front End Template")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hack-ink/slothunter/"},"Slothunter")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Identicon"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/RidOne-technologies/polkadot-web-identicon"},"PolkadotWebIdenticon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RidOne-technologies/polkadot-angular-identicon"},"Polkadot Angular IdentIcon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Noc2/Bird-Identicon"},"Bird Identicon")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/KappaSigmaMu/ksm-app"},"KappaSigmaMu Fratority")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAK-Foundation/quadratic-funding-webapp"},"Quadratic Funding Webapp")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://gitlab.com/polkawatch/polkawatch"},"Polkawatch"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bytepayment/bytepay"},"Bytepay")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Delmonicos/charging-management-platform"},"charging-management-platform")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TDSoftware/subidentity-webapp"},"subidentity-webapp")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opensquare-network/paid-qa/"},"OpenSquare Paid QA")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CrossChainLabs-DOT/dotpulse-api"},"DotPulse")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bsn-si/rubeus-smartcontract"},"Rubeus Keeper")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/justmert/eco-flow-frontend"},"Polkaflow")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/helikon-labs/chainviz-v1"},"ChainViz")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Portfolio Viewer like Zapper or Zerion")))),(0,o.kt)("h3",{id:"tools-apis-and-languages"},"Tools, APIs, and Languages"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Runtime/Parachain frameworks"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-sdk"},"Polkadot Blockchain SDK")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/gosemble"},"Gosemble")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/subsembly"},"Subsembly")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/parachain-utilities"},"Parachain utilities")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gantree-io/gantree-core"},"Gantree")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"Tools to create parachains from frameworks used in other ecosystems")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Client Libraries"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/capi"},"Capi - Typescript")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kodadot/packages/tree/main/sub-api"},"sub-api")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/centrifuge/go-substrate-rpc-client"},"Go")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/polkadot_api_dotnet"},".Net")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ajuna-network/Ajuna.NetApi"},".NET Standard 2.0")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SubstrateGaming/Substrate.NET.Toolchain"},"Substrate .NET Toolchain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/polkadot_api_cpp"},"C++")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/finoabanking/substrate-c-tool"},"C")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/airalab/hs-web3"},"Haskell")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/api"},"Javascript")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-api-sidecar"},"Substrate API Sidecar - TypeScript")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkascan/py-substrate-interface"},"Python")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emeraldpay/polkaj"},"Java (+ Android)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/strategyobject/substrate-client-java"},"Substrate Client Java")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/scs/substrate-api-client"},"Rust SCS")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/subxt"},"Rust Parity (subxt)")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/trevor-crypto"},"Rust pdotc")," ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/php-substrate-api"},"PHP (gmajor-encrypt)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/neha0921/substrate-interface-package"},"PHP (neha0921)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/frontier"},"RPC-Ethereum")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tesseract-one/Substrate.swift"},"Swift")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NodleCode/substrate-client-kotlin"},"Kotlin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/substrate-client-kotlin"},"substrate-client-kotlin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/substrate-client-swift"},"substrate-client-swift")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rankanizer/polkadart"},"Dart")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polywrap/integrations"},"Substrate Core Polywrapper")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"RPC Gateway"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/subway"},"Subway")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Substrate Contract clients"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/go-patract"},"PatractGo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Easy Runtime Development"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/hack-ink/subalfred"},"Subalfred")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kaichaosun/substrate-stencil"},"substrate-stencil")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kaichaosun/play-substrate"},"Play Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/substrate-developer-hub/substrate-node-template"},"substrate-node-template")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-playground"},"Substrate Playground")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/as-substrate-runtime"},"AssemblyScript Runtime Generation")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/clearloop/sup"},"Substrate Package Manager")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/subsembly"},"Subsembly: Framework for developing AssemblyScript Substrate Runtimes")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bkchr/diener"},"dependency diener")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Easy Smart Contract Development"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/swankyhub/swanky-cli"},"Swanky-cli")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/727-ventures/typechain-polkadot"},"Typechain Polkadot")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/ink-playground"},"ink-playground")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/drink"},"DRink!")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockchain-it-hr/ink-remix-plugin"},"Ink! Remix Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/standardweb3/signac/"},"Signac")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/scio-labs/inkathon"},"INK!athon")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/avirajkhare00/ink-boxes/"},"ink!-boxes")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/avirajkhare00/ink-wizard"},"ink!-smart-contract-wizard")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/protofire/polkadot-contract-wizard"},"Polkadot Contract Wizard")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/ink-wrapper"},"ink-wrapper")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ink-analyzer/ink-vscode"},"ink! Analyzer for VS Code")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"IDE Plugins"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ink-analyzer/ink-analyzer"},"Ink! Analyzer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/vscode-substrate"},"Substrate Marketplace VS Code Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/everstake/vscode-plugin-substrate"},"VS Code Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/everstake/atom-plugin-substrate"},"Atom Code Plugin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/zombienet-vscode-extension"},"zombienet extension")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Runtime/Pallet Security"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/srlabs/substrate-runtime-fuzzer"},"Substrate Runtime Fuzzer")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/shawntabrizi/substrate-toml-lint"},"Substrate Toml Lint")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kframework/wasm-semantics"},"K specifications")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSecurity/polpatrol"},"PolPatrol - Polkadot Runtime Checker")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"Automated Runtime checking tools, economic audit simulator such as ",(0,o.kt)("a",{parentName:"td",href:"https://gauntlet.network/"},"gauntlet.network"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Smart Contract Languages"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ask-lang/ask"},"Ask!")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/slickup/subscript"},"Subscript")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hyperledger-labs/solang"},"Solang")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/ink"},"Ink!")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/eigerco/pallet-move"},"pallet-move")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pontem-network/sp-move"},"Move VM Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/neatcoin/neatcoin"},"Move smart contract by Neatcoin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/727-Ventures/sol2ink"},"Sol2Ink")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pepyakin/substrate-seal-ebpf"},"eBPF Contracts Hackathon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/koute/polkavm"},"PolkaVM")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Functional Programming Languages, other languages with developed toolchains")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Smart Contract Security"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Brushfam/patron-backend/"},"Patron")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Testing"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-introspector"},"Polkadot introspector")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/subdirectory/subshell"},"Subshell")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polytope-labs/sc-simnode"},"substrate-simnode")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/halva-suite/halva"},"Halva")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/ink-waterfall"},"Ink Waterfall")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/redspot"},"Redspot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/mixbytes/tank"},"MixBytes Tank")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NikVolf/sub-flood"},"sub-flood")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-debug-kit"},"Substrate debug-kit")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/arijitAD/dotscale"},"Dotscale - SCALE Codec Comparator")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/JesseAbram/asset_cli_tool"},"Asset CLI tool")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/JesseAbram/unfinished_testing_tool"},"sub_crash")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chevdor/subwasm"},"subwasm")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ascjones/subsee"},"subsee")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-lab"},"polkadot-lab")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dwellir-public/rpc-perf/"},"RPC-perf")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Static Analysis"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/KaiserKarel/substrace"},"Substrace")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/simon-perriard/saft"},"Static analyzer for Substrate FRAME's pallets")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CoinFabrik/scout"},"CoinFabrik Scout")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Testnet"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/zombienet"},"Zombienet")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/chopsticks"},"Chopsticks")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-launch"},"Polkadot Launch")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/koute/polkadot-starship"},"polkadot-starship")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/maxsam4/fork-off-substrate"},"Fork off Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/try-runtime-cli"},"try-runtime-cli")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/parachain-launch"},"Parachain Launch")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Benchmarking"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-sdk/tree/master/substrate/utils/frame/benchmarking-cli"},"Benchmarking CLI")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-stps"},"Polkadot sTPS")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/0xekez/clockchain"},"Clockchain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/shawntabrizi/substrate-graph-benchmarks"},"Substrate Graph Benchmarks")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Nikhil-Desai-Talentica/substrate-node-template-benchmarking"},"ink! & pallet benchmarking template")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/smart-bench"},"smart-bench")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Blockchain Indexing Engine"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/subsquid/squid-sdk"},"Squid SDK")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hybrid-explorer/hybrid-indexer"},"Hybrid Indexer"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-archive"},"Substrate Archive")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/polkadot_psql_indexer"},"PSQL Indexer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/playzero/substrate-graph"},"Substrate Graph")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OnFinality-io/subql"},"Subquery")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/p2p-org/polkadot-profit-transformer"},"MBELT3")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kodadot/stick"},"stick")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Infra3-Network/hyperdot"},"Hyperdot")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Blockchain/Event Monitoring"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/guardian"},"Web3 Guardian")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/HugoByte/aurras-event-manager"},"Aurras Event Manager")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hicommonwealth/chain-events"},"@commonwealth/chain-events")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/massbitchain"},"Massbit")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kianenigma/polkadot-basic-notification"},"Polkadot Basic Notifications")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sodazone/ocelloids"},"Ocelloids")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TrackingChains/TrackingChain"},"Tracking Chain")," \ud83d\udfe2,"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Gaming"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/dodorare/crossbow"},"Crossbow")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://amethyst.rs/"},"Amethyst")," + ",(0,o.kt)("a",{parentName:"td",href:"https://substrate.dev/"},"Substrate"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"No-code Platforms"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/NovaBloq/Bubble-Plugin-Polkadot.js"},"EzCode's Polkadot.js plugin on Bubble.io")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Blackprint/nodes-polkadot.js"},"Blackprint Visual Programming Polkadot.js module")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/subrelay/interface"},"SubRelay")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Wallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/TalismanSociety/talisman-connect"},"Talisman Connect")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Koniverse/SubConnect"},"SubWallet-SubConnect")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nova-wallet/metadata-portal"},"Metadata Portal")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tesseract-one/Tesseract.rs"},"Tesseract")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/walletconnect-v2-monorepo"},"WalletConnect")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/BitGo/BitGoJS/tree/master"},"BitGoJS")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"XCM"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/trappist"},"Trappist")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/PureStake/xcm-tools"},"XCM-tools")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/substrate-api-rpc"},"XCM-tools Golang")," \ud83d\udfe2,",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paraspell/ui-v2"},"ParaSpell")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/t3rn/xbi"},"XBI")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/blockcoders/xcm-sdk"},"XCM TS/JS SDK")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/asset-transfer-api"},"asset-transfer-api")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/txwrapper-core"},"txwrapper-core")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/open-web3.js"},"open-web3 JS library")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CycanTech/GVM-Bridge"},"VM-Bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/srtool"},"srtool")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chevdor/srtool-cli"},"srtool-cli")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-tip-bot"},"Substrate Tip Bot")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/syntifi/ori"},"ORI (Onchain Risk Intelligence)")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/albertov19/PolkaTools"},"PolkaTools")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/polkadot-scripts"},"polkadot-scripts")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/virto-network/sube"},"Sube")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/data-store-sidecar"},"data-store-sidecar")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SugarFunge/sugarfunge-node"},"SugarFunge")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/second-state/substrate-wasmedge"},"substrate-wasmedge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/eightfish-org/eightfish"},"EightFish")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sandoxio/sandox"},"Sandox")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"ink-smart-contracts"},"ink Smart Contracts"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Bridges"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/dantenetwork/protocol-stack-for-ink"},"Dante Protocol")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DeFi"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/pendulum-chain/pendulum-ink-wrapper"},"Pendulum-Ink-Wrapper"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RottenKiwi/Panorama-Swap-INK-SC"},"Panorama Swap")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Juminstock/ink_bank"},"ink_bank")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/realnimish/polkadot-amm"},"Polkadot AMM")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/veradefi/defi"},"Vera")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nsure-tech/dot-contract"},"Nsure Insurance")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CycanTech/ELC"},"Everlasting Cash")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Coinversation/coinpro"},"Coinversation")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zenlinkpro/zenlink-dex-contract"},"zenlink-dex-contract")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ReserveLabs/AlgoCash"},"AlgoCash")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"New seigniorage-style stable coins")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Gaming"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/OpenEmojiBattler/open-emoji-battler"},"Open Emoji Battler")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/WiktorStarczewski/newomega.polkadot/blob/master/newomega_delegator/newomega/newomega.rs"},"NewOmega")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DAO"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/SyncraDAO/modular-dao"},"SyncraDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/subDAO-contracts"},"subDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RainbowcityFoundation/RainbowDAO-Protocol-Ink-milestone_1"},"RainbowDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Mangoboxlabs/Mangoboxink"},"MangoBox")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Mangoboxlabs/MangoSaleV2"},"MangoSale")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Identity/DID"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/TheDotflow"},"Dotflow")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Oracle"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/diadata-org/dia-wasm-oracle"},"DIA WASM Oracle")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Spam Protection"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/prosopo-io/integration"},"Prosopo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Tooling"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/h4nsu/openbrush-contracts"},"OpenBrush")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Governance"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/AbaxFinance/Governance"},"Abax Governance")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"NFT"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ArtZero-io/Contracts"},"ArtZero")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/swankyhub/magink-dapp"},"magink")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/ink-test-contracts"},"ink-test-contracts")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/agryaznov/candle-auction-ink"},"Candle Auctions")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SubDAO-Network/polkasign-contract"},"polkasign-contract")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bsn-si/ocex-cli"},"OCEX")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/RoloiMoney/roloi-polkadot-w3f-grant"},"Roloi")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadrys/openPayroll"},"OpenPayroll")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/InkSmartContract/BlockchainFoodOrder"},"BlockchainFoodOrder")),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"chains-and-pallets"},"Chains and Pallets"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Scalable Transactions"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/perun-network/perun-polkadot-pallet"},"Perun channels")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/perun-network/perun-polkadot-demo"},"CLI demo of Perun")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/Astar"},"Astar")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/celer-network/cChannel-substrate"},"Celer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/GunClear/Gunero"},"Gunclear")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/BCS-Labs/tpscore-etl-system"},"TPScore")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"roll-ups, DAG-based consensus mechanisms, side chains")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Bridges"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/interlay/interbtc"},"interBTC")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/webb-tools/dkg-substrate"},"DKG Substrate")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sygmaprotocol/sygma-substrate-pallets"},"Sygma")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bifrost-finance/bifrost-eos-relay"},"EOS by Bifrost")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-bridge"},"POA - Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/akropolisio/POC-polkadai-bridge"},"Substrate - Ethereum DAI Bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-bridge-relay"},"Substrate - Substrate Bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chainx-org/ChainX"},"BTC by ChainX")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChorusOne/wormhole-bridge"},"Cosmos-Substrate bridge")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/octopus-network/substrate-ibc"},"Substrate IBC Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Snowfork/polkadot-ethereum"},"Polkadot Ethereum Bridge")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/darwinia-network/darwinia"},"Darwinia")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pendulum-chain/spacewalk"},"Spacewalk: a Stellar bridge")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/filecoindot"},"Filecoindot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/centrifuge/axelar-cgp-substrate/tree/main"},"Axelar-Substrate")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},"ZCash")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Privacy"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LayerXcom/zero-chain"},"ZeroChain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/xx-labs/xxchain"},"xx network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Phala-Network/phala-blockchain"},"pLibra (Phala Network)")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/automata-network/automata"},"Automata Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zero-network/zero"},"Zero Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/appliedblockchain/silentdata-polkadot"},"Silent Data")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/anoma/masp"},"Multi-Asset Shielded Pool (MASP)")," , ",(0,o.kt)("a",{parentName:"td",href:"https://arxiv.org/pdf/2009.01020.pdf"},"Zkay"),", ",(0,o.kt)("a",{parentName:"td",href:"https://eprint.iacr.org/2018/962.pdf"},"Zexe"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"ZKP"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/zeropoolnetwork/zeropool-substrate-groth16-example"},"ZeroPool")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/megaclite"},"Megaclite")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/patractlabs/zkmega"},"zkMega")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AstarNetwork/plonk"},"PLONK for Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/webb-tools/protocol-substrate"},"Webb Anchor Protocol")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bright/zk-snarks-with-substrate/"},"zk-SNARKs tutorial")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zkvers/substrate-zk"},"substrate-zk")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"TEE"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Acurast/acurast-core"},"Acurast")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/integritee-network/worker"},"Integritee")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/scs/substraTEE"},"substraTEE")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/keysafe-protocol/keysafe-app"},"Keysafe Protocol")," \u26aa")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DeFi"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/kapilsinha/privadex"},"PrivaDEX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/uinb/fusotao"},"Fusotao")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/reef-defi/reef-chain"},"Reef")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Diora-Network/Diora"},"Diora")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pendulum-chain/pendulum"},"Pendulum Chain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/compound-finance/gateway"},"Compound Gateway")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/parallel-finance/parallel"},"Parallel Finance")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/PINT"},"PINT")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/laminar-protocol/laminar-chain"},"Laminar Chain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AcalaNetwork/Acala"},"Acala")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/centrifuge/centrifuge-chain"},"Centrifuge")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stafiprotocol/stafi-node"},"Stafi")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/y2labs-0sh/definex"},"Definex")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAXFoundation/parrot"},"OAX Foundation")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/alexxuyang/substrate-dex"},"Cybex")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zenlinkpro/pallet-zenlink"},"Zenlink")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/lsaether/pallet-swaps"},"Swaps Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Polkadex-Substrate/Polkadex/tree/master"},"Polkadex")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/subdarkdex/subdex-parachain"},"SubDEX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/hack.HydraDX-node"},"HydraDX")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/apopiak/stablecoin"},"Substrate Stablecoin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/digitalnativeinc/standard-substrate"},"Standard protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sora-xor/sora2-network"},"Polkaswap")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/equilibrium-eosdt/equilibrium-curve-amm"},"Curve AMM")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/konomi-network/cumulus/"},"Konomi Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nutsfinance/stable-asset"},"Stable Asset")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/atscaletech/libra"},"Libra Payment")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/mangata-finance/mangata-node"},"Mangata")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tidelabs/tidechain"},"Tidechain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/Basilisk-node"},"Basilisk")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/PolymeshAssociation/Polymesh"},"Polymesh")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"DEX with privacy and confidentiality features such as those found in a ",(0,o.kt)("a",{parentName:"td",href:"https://en.wikipedia.org/wiki/Dark_pool"},"dark pool"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Smart contract chains"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/PureStake/moonbeam"},"moonbeam")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/aleph-node"},"Aleph-node")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hicommonwealth/edgeware-node"},"Edgeware")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ParaState/substrate-ssvm-node"},"ParaState")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gear-tech/gear"},"gear")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/cennznet/cennznet"},"CENNZnet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/skyekiwi/skyekiwi-network"},"SkyeKiwi")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAK-Foundation/OAK-blockchain"},"OAK-blockchain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3labs/ice-substrate"},"ICE Blockchain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OmniBTC/PSC"},"Polkadot Smart Chain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/keep-starknet-strange/madara"},"Madara - Cairo/Starknet")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"smart contract chains with novel security approaches, smart contract chains based on existing toolchains")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Oracle"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/laminar-protocol/open-runtime-module-library/tree/master/oracle"},"Laminar")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/smartcontractkit/chainlink-polkadot"},"Chainlink-polkadot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/aresprotocols/ares"},"Ares Protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Kylin-Network/kylin-node"},"Kylin Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/interlay/interbtc-clients/tree/master/oracle"},"interbtc-clients oracle")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/webb-tools/anonima"},"Anonima")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SaaS3-Foundation/dRuntime-fat"},"SaaS3")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tellor-io/tellor-parachain-contracts"},"Tellor")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/diadata-org/bridgestate-ocw"},"Bridgestate Oracle")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Identity/DID"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/parami-foundation/parami-blockchain"},"Parami")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/litentry/litentry-parachain"},"Litentry")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/substrate-developer-hub/pallet-did"},"pallet-did")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/prasad-kumkar/dot-id"},"dot-id")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"IoT"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/NodleCode/chain"},"Nodle")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DataHighway-DHX/node"},"MXC/DataHighway")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/peaqnetwork/peaq-network-node"},"peaq-network-node")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Verifiable Claims"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/KILTprotocol/kilt-node"},"KILT")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/docknetwork/dock-substrate"},"Dock")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/fennelLabs/Fennel-Protocol"},"Fennel Protocol")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Supply chain"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/digicatapult/dscp-node"},"DSCP Node")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Health care"),(0,o.kt)("td",{parentName:"tr",align:null}),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Music Industry"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Allfeat/Allfeat"},"Allfeat Network")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Data Availability"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/availproject/avail"},"Avail")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ZeroDAO/melodot"},"Melodot")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Social Networking"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LibertyDSNP/frequency"},"Frequency")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/social-network/blockchain"},"Social Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dappforce/subsocial-parachain"},"SubSocial")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ZeroDAO/ZeroDAO-node"},"ZeroDAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/myriadsocial/myriad-node"},"Myriad Node")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/randombishop/wika_etl"},"Wika Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LibertyDSNP/mrc"},"Project Liberty")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/listenofficial/listen-parachain"},"Listen")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tribal-protocol/tribal_contract"},"Tribal Protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rust-0x0/hex-space-protocol-substrate"},"Five Degrees on Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/acuity-social/acuity-substrate"},"Acuity Social")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},"Private instant messenger that uses on-chain identity")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Governance/DAO"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/hashed-io/hashed-substrate"},"Hashed Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sunshine-protocol/sunshine-bounty"},"Sunshine DAO")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NucleiStudio/governance-os"},"Governance OS")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/idavollnetwork/idavoll"},"Idavoll Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DoraFactory/Substrate-Moloch-V2"},"Substrate Moloch")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Qrucial/QRUCIAL-DAO"},"QRUCIAL-DAO")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sctllabs/societal-node"},"Societal")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/daos-org/daos"},"DAOs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/amiyatulu/shivarthu/"},"Shivarthu")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/faterium"},"Faterium")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/decentration/apps"},"Supersig")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/deep-ink-ventures/genesis-dao-node"},"GenesisDAO")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dao-entrance/dao-entrance-node"},"DAO Entrance")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/liberland/liberland_substrate"},"Liberland")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/consul/consul"},"Consul")," - Open Government and E-Participation Web Software")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Prediction Markets and Futarchy"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/zeitgeistpm/zeitgeist"},"Zeitgeist")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/XPredictMarket/NodePredict"},"X Predict Market")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Messaging"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/validitylabs/HOPR-PL-Substrate"},"HOPR")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chainify/nolik"},"Nolik")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Uke-Messaging/uke-pallet"},"Uke")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Belsoft-rs/diffychat-pallet"},"Diffy Chat")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"File Storage, Cloud"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/dappforce/subsocial-offchain"},"Subsocial-Offchain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/playproject-io/datdot"},"DatDot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/crustio/crust"},"Crust Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rs-ipfs/offchain-ipfs-manual"},"offchain::ipfs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/canyon-network/canyon"},"Canyon Network")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cumulus2021/cess"},"CESS")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/cess-proving-system"},"CESS Proving Subsystem")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ideal-lab5/iris"},"Iris")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/CESSProject/fmd-cess"},"fmd-cess")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DanHenton/pocket-substrate/tree/ipfs-ocw"},"IPFS Frame V3")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/threefoldtech/tfchain"},"Threefold Chain")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Apron-Network/apron-node"},"Apron")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TDSoftware/substrate-ipfs"},"IPFS Utilities")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Name Service"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/xaya/substrate-names"},"Substrate Names")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hskang9/substrate-name-service"},"ENS on Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/pnsproject/pns-pallets"},"PNS-Pallets")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/HeisenbergLin22/Faceless_milestone2_delivery"},"Faceless")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ff13dfly/Anchor"},"Anchor")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Gaming"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/bit-country/Bit-Country-Blockchain"},"Bit.country")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SubGame-Network/subgame-network"},"SubGame")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/playzero/subzero"},"subzero")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/web3gamesofficial/web3games-blockchain"},"Web3Games")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ajuna-network/Ajuna"},"Ajuna Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/cryptoviet/gafi"},"Gafi Network")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://gitlab.com/asylum-space/asylum-item-nft"},"Asylum")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/3Dpass/3DP"},"3DPass")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polketio/toearnfun_flutter_app"},"Polket")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Computation/AI"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/DeepBrainChain/DeepBrainChain-MainChain"},"DeepBrain Chain")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/anudit/cerebrum"},"AI Infrastructure on Blockchain")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Enable specific use-cases"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/airalab/substrate-node-robonomics"},"Robonomics")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/UniversalDot/pallets"},"UniversalDOT")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/EvercityEcosystem/evercity-chain"},"Evercity Sustainable Finance Protocol")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/fennelLabs/Fennel-Protocol"},"Fennel Protocol")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/logion-network/logion-node"},"logion")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"NFT"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/capsule-corp-ternoa/chain"},"ternoa")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/danforbes/pallet-nft"},"FRAME Pallet: NFTs for Substrate")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/UniqueNetwork/unique-chain"},"Unique NFT Parachain")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DNFT-Team/dnft-substrate-node/tree/master/pallets"},"DNFT")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rmrk-team/rmrk-substrate"},"RMRK-Substrate")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Popular-Coding/nt-nft"},"NT-NFTs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/GreenLemonProtocol/dksap-polkadot"},"Green Lemon")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/Basilisk-node"},"Basilisk")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Randomness"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/substrate/tree/randomness-beacon"},"DKG and Randomness Beacon")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/random-meat/drand-substrate-client"},"drand-substrate-client")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Licensing"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/anagolay/anagolay-chain"},"Anagolay Network")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Banking Integration"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/element36-io/ebics-java-service"},"FIAT on-off-ramp")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Crowdfunding"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ImbueNetwork/imbue"},"Imbue Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/zhangjiannan/QFgrant"},"Quadratic Funding pallet by Dora")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/OAK-Foundation/quadratic-funding-pallet/tree/master"},"Quadratic Funding pallet by OAK")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://ethresear.ch/t/minimal-anti-collusion-infrastructure/5413"},"Minimum Anti-Collusion Infrastructure (MACI)"))),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Collection of Pallets"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/open-web3-stack/open-runtime-module-library"},"Substrate Open Runtime Module Library")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/warehouse"},"warehouse")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/InvArch/InvArch-Frames"},"InvArch FRAME Pallet Library")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Marketplaces"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/WowLabz/dot-marketplace-v2/tree/Phase3_Milestone3"},"Dot Marketplace")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/hashed-io/hashed-substrate/tree/main/pallets/gated-marketplace"},"Gated Marketplace")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Popular-Coding/ventur"},"Ventur")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Carbon Credits"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/bitgreen/bitg-node"},"BitGreen")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/EvercityEcosystem/carbon-assets"},"Carbon Assets Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SequesterChain/pallets"},"Sequester Pallets")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"UTXO"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Off-Narrative-Labs/Tuxedo"},"Tuxedo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Moonsong-Labs/moonkit"},"Moonkit")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gautamdhameja/substrate-account-filter"},"Substrate Account Filter")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/opentensor/subtensor"},"Subtensor")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AdMetaNetwork/admeta"},"AdMeta")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/chocolatenetwork/chocolate-node"},"Chocolate Node")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/virto-network/virto-node"},"Virto Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gautamdhameja/substrate-validator-set"},"Substrate Validator Set")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/DEIPworld/deip-node"},"DEIP")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/debionetwork/debio-node"},"DeBio")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/mathwallet/MathChain"},"MathChain")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/encointer/encointer-node"},"encointer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/grasslandnetwork/substrate_node"},"Grassland")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/rusty-crewmates/substrate-tutorials"},"Substrate-Tutorials")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Fair-Squares/fair-squares"},"Fair Squares")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/totem-tech/totem"},"Totem Live Accounting")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/herou/EscrowPallet"},"Escrow Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/NexTokenTech/TREX"},"TREX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/relationlabs/Relation-Graph"},"Relation Graph")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gertt/Invoice"},"Decentralized Invoice")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/redstone-network/redstone-node"},"Redstone Network")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/WunderbarNetwork/access-control"},"Access Control Pallet")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Omniverse-Web3-Labs/omniverse-swap/tree/web3-grant"},"Omniverse DLT")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polytope-labs/substrate-ismp"},"ISMP")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/xcmp_prototype_playground"},"XCMP"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/dhiway/cord"},"CORD Chain")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null},"Decentralized review/reputation system")))),(0,o.kt)("h3",{id:"host"},"Host"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Rust"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate"},"Substrate")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/cumulus"},"Cumulus")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"C++"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/kagome"},"Kagome")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/mayon"},"Mayon")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Go"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/gossamer"},"Gossamer")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Java"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/Fruzhin"},"Fruzhin")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/java-host-research"},"Java Host Research")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"AssemblyScript"),(0,o.kt)("td",{parentName:"tr",align:null}),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Light Client"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/smol-dot/smoldot"},"smoldot")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate-connect"},"Substrate Connect")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/eqlabs/polkadot-light-client"},"C++ Polkadot Light Client")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Testing"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/polkadot-conformance"},"Polkadot Conformance")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sigp/polkafuzz"},"Polkafuzz")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"network-maintenance-tools"},"Network Maintenance Tools"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Secure validator setup"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkachu/polkadot-validator"},"Polkadot Validation Node Ansible Setup")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-validator-setup"},"W3F Polkadot Validator Setup")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Nexus2k/polkadot-ansible"},"polkadot-ansible")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"High availability setup"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/luguslabs/archipel"},"Archipel")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/protofire/polkadot-failover-mechanism"},"Polkadot Failover Mechanism")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Datagen-Project/Datagen-Substrate-Grant"},"Datagen")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/bright/substrate-raft"},"High Availability Validator Setup")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Load Balanced Endpoints"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/insight-w3f/terragrunt-polkadot"},"terragrunt-polkadot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sudoblockio/substrate-meta"},"Geometry Labs' Substrate Meta repo")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Deployment Tools"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Blockdaemon/bpm-sdk"},"Polkadot Package Manager")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/akropolisio/polkahub-monorepo"},"PolkaHub")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/AvadoDServer/AVADO-DNP-Polkadot-custom"},"Avado")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-deployer"},"Polkadot Deployer")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/for-parity-with-love/unified-collator-node-deployment"},"Unified Collator Deployment")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator monitoring"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/turboflakes/one-t"},"ONE-T")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/helikon-labs/subvt-backend"},"SubVT")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/SimplyVC/panic"},"P.A.N.I.C.")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/galacticcouncil/polkalert"},"Polkalert")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nodebreaker0-0/substrate/tree/prometheus_v0.3"},"B-Harvest")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stakezone/nmonpolkadot"},"nmonpolkadot")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ironoa/polkadot-k8s-monitor"},"Polkadot-K8s-Monitor")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-watcher"},"Polkadot-Watcher")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/helikon-labs/polkadot-kusama-1kv-telegram-bot"},"1KV Telegram Bot")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator payout management"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Colm3na/substrate-auto-payout"},"Substrate validator auto payout")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/polkadot-payouts"},"Polkadot Payouts")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emostov/staking-payouts"},"staking-payouts CLI")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/stakelink/substrate-payctl"},"Payctl")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/turboflakes/crunch"},"crunch")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Staking Miner"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/staking-miner-v2"},"Staking Miner v2")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Nominator Tools"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/miepsik/validators_selection"},"Validator Selection")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/filippoweb3/polkanalyzer"},"Polkanalyzer")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/filippoweb3/polkanalyzer-app"},"Polkanalyzer-app")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"signatures"},"Signatures"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SR25519"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/schnorrkel"},"rust")," \ud83d\udfe2(contains partial bindings for C, JavaScript, and Python), ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gautamdhameja/sr25519-dotnet"},".Net bindings")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/sr25519"},"C")," \u26aa",(0,o.kt)("em",{parentName:"td"},"(old)"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/TerenceGe/sr25519-donna"},"C")," \u26aa",(0,o.kt)("em",{parentName:"td"},"(new)"),", ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/soramitsu-sr25519-crust"},"C/C++")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/usetech-llc/sr25519_dotnet"},"C#")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/go-schnorrkel"},"Go")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/debuggor/schnorrkel-java"},"java")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/sr25519-bindings"},"PHP")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Signature Aggregation"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f/apk-proofs"},"apk-proofs")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Distributed key generation (DKG) or management"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/isislovecruft/frost-dalek"},"keygen.rs")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/w3f-grants-archive/sword"},"Secure Wallet Origin Distribution (SWORD)")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Validator HSMs"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Zondax/buildroot-zondax"},"Zondax Remote Signer")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"consensus"},"Consensus"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"PoC"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/subspace/substrate"},"Spartan")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"PoW"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/client/consensus/pow"},"PoW consensus for Substrate")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/kulupu/kulupu/tree/master/pow"},"RandomX")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/substrate-developer-hub/recipes/tree/master/consensus/sha3pow"},"Sha3 PoW")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Block production"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/client/consensus/babe"},"BABE")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/client/consensus/aura"},"Aura")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Finality"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/substrate/tree/master/frame/grandpa"},"GRANDPA")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Cardinal-Cryptography/AlephBFT"},"AlephBFT")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Other"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/PureStake/nimbus"},"Nimbus: Upgradeable consensus framework")," \ud83d\udfe1"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"networking"},"Networking"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCALE Codec"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-scale-codec"},"Rust")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/paritytech/parity-scale-codec-ts"},"TypeScript")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkascan/py-scale-codec"},"Python")," \ud83d\udfe1, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/ChainSafe/gossamer/tree/development/pkg/scale/"},"Golang Chainsafe")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/scale.go"},"Golang Itering")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/MatthewDarnell/cScale"},"C")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/scale-codec-cpp"},"C++")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/polkadot-js/api"},"JavaScript")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/LimeChain/as-scale-codec"},"AssemblyScript")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/airalab/hs-web3/tree/master/packages/scale/src/Codec"},"Haskell")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emeraldpay/polkaj"},"Java")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/itering/scale.rb"},"Ruby")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/nbltrust/dart-scale-codec"},"Dart")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/tesseract-one/swift-scale-codec"},"Swift")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/scale-codec-swift"},"scale-codec-swift")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/sublabdev/scale-codec-kotlin"},"scale-codec-kotlin")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/php-scale-codec"},"PHP")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/soramitsu/scale-codec-js-library"},"JavaScript by Soramitsu")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/gmajor-encrypt/scale-codec-comparator"},"Scale Codec Comparator")," \ud83d\udfe2, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/darwinia-network/darwinia-messages-sol/blob/master/contracts/utils/contracts/ScaleCodec.sol"},"ScaleCodec.sol by Darwinia")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/Snowfork/snowbridge/blob/main/core/packages/contracts/contracts/ScaleCodec.sol"},"ScaleCodec.sol by Snowfork")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Networking Framework"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/libp2p/libp2p"},"libp2p")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"DHT Crawler"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/atredispartners/dht-crawler-polkadot"},"Go")," \u26aa, ",(0,o.kt)("a",{parentName:"td",href:"https://github.com/emeraldpay/polkabot"},"Kotlin")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"RPC Tor-like access"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/Evanesco-Labs/WhiteNoise.rs"},"WhiteNoise")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h3",{id:"primitives"},"Primitives"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Components"),(0,o.kt)("th",{parentName:"tr",align:null},"Existing projects"),(0,o.kt)("th",{parentName:"tr",align:null},"Potentially interesting projects"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Storage"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/frisitano/merkle-tree-db"},"Merkle Tree DB")," \u26aa"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Merkle Proofs"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("a",{parentName:"td",href:"https://github.com/polytope-labs/solidity-merkle-trees"},"Solidity Trie Verifier")," \ud83d\udfe2"),(0,o.kt)("td",{parentName:"tr",align:null})))),(0,o.kt)("h2",{id:"contributing"},"Contributing"),(0,o.kt)("p",null,"Pull requests, issues, or other contributions from the community are encouraged! You can not only\nadd specific projects, but also potentially interesting fields/areas which are currently missing in\nthe tech stack."),(0,o.kt)("p",null,"\u2757 All technologies listed above need to be open-source. Ideally, the links\nlead directly to the code."),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Note: You will need a GitHub account to suggest changes or open issues. If you do not have one, you\nmay ",(0,o.kt)("a",{parentName:"em",href:"https://github.com/join"},"sign up for free"),".")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4200fe5.025c4bbe.js b/assets/js/f4200fe5.025c4bbe.js new file mode 100644 index 000000000000..002d4b6fd4e4 --- /dev/null +++ b/assets/js/f4200fe5.025c4bbe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2909],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=o,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||r;return a?n.createElement(h,l(l({ref:t},p),{},{components:a})):n.createElement(h,l({ref:t},p))}));function h(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=a.length,l=new Array(r);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:o,l[1]=i;for(var u=2;u{a.d(t,{Z:()=>l});var n=a(67294),o=a(86010);const r={tabItem:"tabItem_Ymn6"};function l(e){var t=e.children,a=e.hidden,l=e.className;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,l),hidden:a},t)}},74866:(e,t,a)=>{a.d(t,{Z:()=>v});var n=a(87462),o=a(67294),r=a(86010),l=a(12466),i=a(16550),s=a(91980),u=a(67392),p=a(50012);function d(e){return function(e){var t,a;return null!=(t=null==(a=o.Children.map(e,(function(e){if(!e||(0,o.isValidElement)(e)&&(t=e.props)&&"object"==typeof t&&"value"in t)return e;var t;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.')})))?void 0:a.filter(Boolean))?t:[]}(e).map((function(e){var t=e.props;return{value:t.value,label:t.label,attributes:t.attributes,default:t.default}}))}function c(e){var t=e.values,a=e.children;return(0,o.useMemo)((function(){var e=null!=t?t:d(a);return function(e){var t=(0,u.l)(e,(function(e,t){return e.value===t.value}));if(t.length>0)throw new Error('Docusaurus error: Duplicate values "'+t.map((function(e){return e.value})).join(", ")+'" found in . Every value needs to be unique.')}(e),e}),[t,a])}function m(e){var t=e.value;return e.tabValues.some((function(e){return e.value===t}))}function h(e){var t=e.queryString,a=void 0!==t&&t,n=e.groupId,r=(0,i.k6)(),l=function(e){var t=e.queryString,a=void 0!==t&&t,n=e.groupId;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!n)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 null!=n?n:null}({queryString:a,groupId:n});return[(0,s._X)(l),(0,o.useCallback)((function(e){if(l){var t=new URLSearchParams(r.location.search);t.set(l,e),r.replace(Object.assign({},r.location,{search:t.toString()}))}}),[l,r])]}function k(e){var t,a,n,r,l=e.defaultValue,i=e.queryString,s=void 0!==i&&i,u=e.groupId,d=c(e),k=(0,o.useState)((function(){return function(e){var t,a=e.defaultValue,n=e.tabValues;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!m({value:a,tabValues:n}))throw new Error('Docusaurus error: The has a defaultValue "'+a+'" but none of its children has the corresponding value. Available values are: '+n.map((function(e){return e.value})).join(", ")+". If you intend to show no default tab, use defaultValue={null} instead.");return a}var o=null!=(t=n.find((function(e){return e.default})))?t:n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:l,tabValues:d})})),b=k[0],f=k[1],g=h({queryString:s,groupId:u}),y=g[0],N=g[1],v=(t=function(e){return e?"docusaurus.tab."+e:null}({groupId:u}.groupId),a=(0,p.Nk)(t),n=a[0],r=a[1],[n,(0,o.useCallback)((function(e){t&&r.set(e)}),[t,r])]),w=v[0],T=v[1],C=function(){var e=null!=y?y:w;return m({value:e,tabValues:d})?e:null}();return(0,o.useLayoutEffect)((function(){C&&f(C)}),[C]),{selectedValue:b,selectValue:(0,o.useCallback)((function(e){if(!m({value:e,tabValues:d}))throw new Error("Can't select invalid tab value="+e);f(e),N(e),T(e)}),[N,T,d]),tabValues:d}}var b=a(72389);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){var t=e.className,a=e.block,i=e.selectedValue,s=e.selectValue,u=e.tabValues,p=[],d=(0,l.o5)().blockElementScrollPositionUntilNextRender,c=function(e){var t=e.currentTarget,a=p.indexOf(t),n=u[a].value;n!==i&&(d(t),s(n))},m=function(e){var t,a=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":var n,o=p.indexOf(e.currentTarget)+1;a=null!=(n=p[o])?n:p[0];break;case"ArrowLeft":var r,l=p.indexOf(e.currentTarget)-1;a=null!=(r=p[l])?r:p[p.length-1]}null==(t=a)||t.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},u.map((function(e){var t=e.value,a=e.label,l=e.attributes;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:function(e){return p.push(e)},onKeyDown:m,onClick:c},l,{className:(0,r.Z)("tabs__item",f.tabItem,null==l?void 0:l.className,{"tabs__item--active":i===t})}),null!=a?a:t)})))}function y(e){var t=e.lazy,a=e.children,n=e.selectedValue,r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){var l=r.find((function(e){return e.props.value===n}));return l?(0,o.cloneElement)(l,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map((function(e,t){return(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n})})))}function N(e){var t=k(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",f.tabList)},o.createElement(g,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function v(e){var t=(0,b.Z)();return o.createElement(N,(0,n.Z)({key:String(t)},e))}},31101:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>b,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),l=a(74866),i=a(85162),s=["components"],u={id:"maintain-sync",title:"Set up a Full Node",sidebar_label:"Set up a Full Node",description:"Steps on how to set up a full node.",keywords:["node","full node","sync","setup node"],slug:"../maintain-sync"},p=void 0,d={unversionedId:"maintain/maintain-sync",id:"maintain/maintain-sync",title:"Set up a Full Node",description:"Steps on how to set up a full node.",source:"@site/../docs/maintain/maintain-sync.md",sourceDirName:"maintain",slug:"/maintain-sync",permalink:"/docs/maintain-sync",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-sync.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695017532,formattedLastUpdatedAt:"Sep 18, 2023",frontMatter:{id:"maintain-sync",title:"Set up a Full Node",sidebar_label:"Set up a Full Node",description:"Steps on how to set up a full node.",keywords:["node","full node","sync","setup node"],slug:"../maintain-sync"},sidebar:"docs",previous:{title:"Node Endpoints",permalink:"/docs/maintain-endpoints"},next:{title:"Set up a Boot Node",permalink:"/docs/maintain-bootnode"}},c={},m=[{value:"Types of Nodes",id:"types-of-nodes",level:3},{value:"Setup Instructions",id:"setup-instructions",level:2},{value:"Debian-based (Debian, Ubuntu)",id:"debian-based-debian-ubuntu",level:3},{value:"RPM-based (Fedora, CentOS)",id:"rpm-based-fedora-centos",level:3},{value:"Get Substrate",id:"get-substrate",level:2},{value:"Clone and Build",id:"clone-and-build",level:2},{value:"Run",id:"run",level:2},{value:"Running an Archive Node",id:"running-an-archive-node",level:2},{value:"Using Docker",id:"using-docker",level:2}],h={toc:m},k="wrapper";function b(e){var t=e.components,a=(0,o.Z)(e,s);return(0,r.kt)(k,(0,n.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"If you're building dApps or products on a Substrate-based chain like Polkadot, Kusama, or a custom\nSubstrate implementation, you want the ability to run a node-as-a-back-end. After all, relying on\nyour infrastructure is always better than a third-party-hosted one in this brave new decentralized\nworld."),(0,r.kt)("p",null,"This guide will show you how to connect to ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/"},"Polkadot network"),", but the\nsame process applies to any other ",(0,r.kt)("a",{parentName:"p",href:"https://substrate.io"},"Substrate"),"-based chain. First, let's\nclarify the term ",(0,r.kt)("em",{parentName:"p"},"full node"),"."),(0,r.kt)("h3",{id:"types-of-nodes"},"Types of Nodes"),(0,r.kt)("p",null,"A blockchain's growth comes from a ",(0,r.kt)("em",{parentName:"p"},"genesis block"),", ",(0,r.kt)("em",{parentName:"p"},"extrinsics"),", and ",(0,r.kt)("em",{parentName:"p"},"events"),"."),(0,r.kt)("p",null,"When a validator seals block 1, it takes the blockchain's state at block 0. It then applies all\npending changes on top of it and emits the events resulting from these changes. Later, the chain\u2019s\nstate at block one is used the same way to build the chain\u2019s state at block 2, and so on. Once\ntwo-thirds of the validators agree on a specific block being valid, it is finalized."),(0,r.kt)("p",null,"An ",(0,r.kt)("strong",{parentName:"p"},"archive node")," keeps all the past blocks and their states. An archive node makes it convenient\nto query the past state of the chain at any point in time. Finding out what an account's balance at\na particular block was or which extrinsics resulted in a specific state change are fast operations\nwhen using an archive node. However, an archive node takes up a lot of disk space - around Kusama's\n12 millionth block, this was around 660 GB."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"On the ",(0,r.kt)("a",{parentName:"p",href:"https://paranodes.io/DBSize"},"Paranodes")," or ",(0,r.kt)("a",{parentName:"p",href:"https://stakeworld.io/docs/dbsize"},"Stakeworld"),"\nwebsites, you can find lists of the database sizes of Polkadot and Kusama nodes.")),(0,r.kt)("p",null,"Archive nodes are used by utilities that need past information - like block explorers, council\nscanners, discussion platforms like ",(0,r.kt)("a",{parentName:"p",href:"https://polkassembly.io"},"Polkassembly"),", and others. They need\nto be able to look at past on-chain data."),(0,r.kt)("p",null,"A ",(0,r.kt)("strong",{parentName:"p"},"full node")," prunes historical states: all finalized blocks' states older than a configurable\nnumber except the genesis block's state. This is 256 blocks from the last finalized one by default.\nA pruned node this way requires much less space than an archive node."),(0,r.kt)("p",null,"A full node could eventually rebuild every block's state without additional information and become\nan archive node. This still needs to be implemented at the time of writing. If you need to query\nhistorical blocks' states past what you pruned, you must purge your database and resync your node,\nstarting in archive mode. Alternatively, you can use a backup or snapshot of a trusted source to\navoid needing to sync from genesis with the network and only need the states of blocks past that\nsnapshot."),(0,r.kt)("p",null,"Full nodes allow you to read the current state of the chain and to submit and validate extrinsics\ndirectly on the network without relying on a centralized infrastructure provider."),(0,r.kt)("p",null,"Another type of node is a ",(0,r.kt)("strong",{parentName:"p"},"light node"),". A light node has only the runtime and the current state\nbut does not store past blocks and so cannot read historical data without requesting it from a node\nthat has it. Light nodes are useful for resource-restricted devices. An interesting use-case of\nlight nodes is a browser extension, which is a node in its own right, running the runtime in WASM\nformat, as well as a full or light node that is completely encapsulated in WASM and can be\nintegrated into web apps: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/smoldot#wasm-light-node"},"https://github.com/paritytech/smoldot#wasm-light-node"),"."),(0,r.kt)("admonition",{title:"Substrate Connect",type:"note"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-connect"},"Substrate Connect")," provides a way to interact with\nsubstrate-based blockchains in the browser without using an RPC server. It is a light node that runs\nentirely in Javascript. Substrate Connect uses a\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/smoldot"},"smoldot WASM light client")," to securely connect to the\nblockchain network without relying on specific 3rd parties. Substrate Connect is available on Chrome\nand Firefox as a ",(0,r.kt)("a",{parentName:"p",href:"https://substrate.io/developers/substrate-connect/"},"browser extension"),".")),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"setup-instructions"},"Setup Instructions"),(0,r.kt)("p",null,"This is not recommended if you're a validator. Please see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator setup")," if you are running validator."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"The bash commands that are provided to run against ",(0,r.kt)("strong",{parentName:"mdxAdmonitionTitle"},"your node")," use ",(0,r.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"Polkadot")," as the"),(0,r.kt)("p",{parentName:"admonition"},"default chain"),(0,r.kt)("p",{parentName:"admonition"},"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--chain")," flag if you follow the setup instructions to setup a ",(0,r.kt)("inlineCode",{parentName:"p"},"Kusama")," node. For example:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name" --chain kusama\n'))),(0,r.kt)(l.Z,{groupId:"operating-systems",values:[{label:"macOS",value:"mac"},{label:"Windows",value:"win"},{label:"Linux (standalone)",value:"linux-standalone"},{label:"Linux (package)",value:"linux-package"}],mdxType:"Tabs"},(0,r.kt)(i.Z,{value:"mac",mdxType:"TabItem"},(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install Homebrew within the terminal by running:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Then, run:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"brew install openssl cmake llvm protobuf\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install Rust by running:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"After Rust is installed, update and add the nightly version:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Ensure the current shell has cargo\nsource ~/.cargo/env\n\n# Update the Rust toolchain\nrustup default stable\nrustup update\n\n# Add the nightly and WebAssembly targets:\nrustup update nightly\nrustup target add wasm32-unknown-unknown --toolchain nightly\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Verify your installation by running the following:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rustup show\n\n# You should see output similar to:\n\nactive toolchain\n----------------\n\nstable-aarch64-apple-darwin (default)\nrustc 1.68.1 (8460ca823 2023-03-20)\n")),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rustup +nightly show\n\n# You should see output similar to:\n\ninstalled targets for active toolchain\n--------------------------------------\n\naarch64-apple-darwin\nwasm32-unknown-unknown\n\nactive toolchain\n----------------\n\nnightly-aarch64-apple-darwin (overridden by +toolchain on the command line)\nrustc 1.71.0-nightly (9ecda8de8 2023-04-30)\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Once Rust is configured, run the following command to clone and build the Polkadot code:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/paritytech/polkadot polkadot\ncd polkadot\n./scripts/init.sh\ncargo build --release\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Start your node:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Find your node on ",(0,r.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot"},"Telemetry"))))),(0,r.kt)(i.Z,{value:"win",mdxType:"TabItem"},(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install ",(0,r.kt)("a",{parentName:"p",href:"https://docs.microsoft.com/en-us/windows/wsl/install-win10"},"WSL"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install ",(0,r.kt)("a",{parentName:"p",href:"https://docs.microsoft.com/en-us/windows/wsl/install-win10"},"Ubuntu")," (same webpage).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Determine the latest version of the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases"},"Polkadot binary"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Download the correct Polkadot binary within Ubuntu by running the following command. Replace\n",(0,r.kt)("inlineCode",{parentName:"p"},"*VERSION*")," with the tag of the latest version from the last step (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"v0.8.22"),"):"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"curl -sL https://github.com/paritytech/polkadot/releases/download/*VERSION*/polkadot -o polkadot\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Then, run the following:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo chmod +x polkadot\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Start your node:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./polkadot --name "Your Node\'s Name"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Find your node on ",(0,r.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot"},"Telemetry"))))),(0,r.kt)(i.Z,{value:"linux-standalone",mdxType:"TabItem"},(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Determine the latest version of the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases"},"Polkadot binary"),"."),(0,r.kt)("admonition",{parentName:"li",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The nature of pre-built binaries means that they may not work on your particular architecture or\nLinux distribution. If you see an error like ",(0,r.kt)("inlineCode",{parentName:"p"},"cannot execute binary file: Exec format error")," it\nlikely means the binary is not compatible with your system. You will either need to compile the\n",(0,r.kt)("a",{parentName:"p",href:"#clone-and-build"},(0,r.kt)("strong",{parentName:"a"},"source code"))," or use ",(0,r.kt)("a",{parentName:"p",href:"#using-docker"},(0,r.kt)("strong",{parentName:"a"},"Docker")),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Download the correct Polkadot binary within Ubuntu by running the following command. Replace\n",(0,r.kt)("inlineCode",{parentName:"p"},"*VERSION*")," with the tag of the latest version from the last step (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"v0.8.22"),"):"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"curl -sL https://github.com/paritytech/polkadot/releases/download/*VERSION*/polkadot -o polkadot\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Run the following: ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo chmod +x polkadot"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Run the following:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Find your node on ",(0,r.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot"},"Telemetry"))))),(0,r.kt)(i.Z,{value:"linux-package",mdxType:"TabItem"},(0,r.kt)("p",null,"You can also install Polkadot from one of our package repositories."),(0,r.kt)("p",null,"Installation from the Debian or rpm repositories will create a ",(0,r.kt)("inlineCode",{parentName:"p"},"systemd")," service that can be used to\nrun a Polkadot node. The service is disabled by default, and can be started by running\n",(0,r.kt)("inlineCode",{parentName:"p"},"systemctl start polkadot")," on demand (use ",(0,r.kt)("inlineCode",{parentName:"p"},"systemctl enable polkadot")," to make it auto-start after\nreboot). By default, it will run as the ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot")," user. Command-line flags passed to the binary can\nbe customized by editing ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/default/polkadot"),". This file will not be overwritten on updating\npolkadot."),(0,r.kt)("h3",{id:"debian-based-debian-ubuntu"},"Debian-based (Debian, Ubuntu)"),(0,r.kt)("p",null,"Currently supports Debian 10 (Buster) and Ubuntu 20.04 (Focal), and derivatives. Run the following\ncommands as the ",(0,r.kt)("inlineCode",{parentName:"p"},"root")," user."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Import the security@parity.io GPG key\ngpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798\ngpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg\n# Add the Parity repository and update the package index\necho 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list\napt update\n# Install the `parity-keyring` package - This will ensure the GPG key\n# used by APT remains up-to-date\napt install parity-keyring\n# Install polkadot\napt install polkadot\n\n")),(0,r.kt)("p",null,"If you don't want polkadot package to be automatically updated when you update packages on your\nserver, you can issue the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt-mark hold polkadot\n")),(0,r.kt)("h3",{id:"rpm-based-fedora-centos"},"RPM-based (Fedora, CentOS)"),(0,r.kt)("p",null,"Currently supports Fedora 32 and CentOS 8, and derivatives."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Install dnf-plugins-core (This might already be installed)\ndnf install dnf-plugins-core\n# Add the repository and enable it\ndnf config-manager --add-repo https://releases.parity.io/rpm/polkadot.repo\ndnf config-manager --set-enabled polkadot\n# Install polkadot (You may have to confirm the import of the GPG key, which\n# should have the following fingerprint: 9D4B2B6EB8F97156D19669A9FF0812D491B96798)\ndnf install polkadot\n")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If you choose to use a custom folder for the polkadot home by passing ",(0,r.kt)("inlineCode",{parentName:"p"},"--base-path '/custom-path'"),",\nyou will need to issue following command:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo mkdir /etc/systemd/system/polkadot.service.d\n")),(0,r.kt)("p",{parentName:"admonition"},"And create a new file inside this folder:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo -e /etc/systemd/system/polkadot.service.d/custom.conf\n")),(0,r.kt)("p",{parentName:"admonition"},"With the following content:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre"},"[Service]\nReadWritePaths=/custom-path\n")),(0,r.kt)("p",{parentName:"admonition"},"And finally issue a reload to have your modifications applied by systemd:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"systemctl daemon-reload\n"))))),(0,r.kt)("h2",{id:"get-substrate"},"Get Substrate"),(0,r.kt)("p",null,"Follow instructions as outlined ",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/quick-start/"},"here")," - note that Windows\nusers will have their work cut out for them. It's better to use a virtual machine instead."),(0,r.kt)("p",null,"Test if the installation was successful by running ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo --version"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"\u03bb cargo --version\ncargo 1.41.0 (626f0f40e 2019-12-03)\n")),(0,r.kt)("h2",{id:"clone-and-build"},"Clone and Build"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot"},"paritytech/polkadot")," repo's master branch contains the\nlatest Polkadot code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/paritytech/polkadot polkadot\ncd polkadot\n./scripts/init.sh\ncargo build --release\n")),(0,r.kt)("p",null,"Alternatively, if you wish to use a specific release, you can check out a specific tag (",(0,r.kt)("inlineCode",{parentName:"p"},"v0.8.3")," in\nthe example below):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/paritytech/polkadot polkadot\ncd polkadot\ngit checkout tags/v0.8.3\n./scripts/init.sh\ncargo build --release\n")),(0,r.kt)("h2",{id:"run"},"Run"),(0,r.kt)("p",null,"The built binary will be in the ",(0,r.kt)("inlineCode",{parentName:"p"},"target/release")," folder, called ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Polkadot"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name"\n')),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--help")," flag to determine which flags you can use when running the node. For example, if\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-wss"},"connecting to your node remotely"),", you'll probably want to use ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-external"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-cors all"),"."),(0,r.kt)("p",null,"The syncing process will take a while, depending on your capacity, processing power, disk speed and\nRAM. On a \\$10 DigitalOcean droplet, the process can complete in some 36 hours."),(0,r.kt)("p",null,"Congratulations, you're now syncing with Polkadot. Keep in mind that the process is identical when\nusing any other Substrate chain."),(0,r.kt)("h2",{id:"running-an-archive-node"},"Running an Archive Node"),(0,r.kt)("p",null,"When running as a simple sync node (above), only the state of the past 256 blocks will be kept. It\ndefaults to ",(0,r.kt)("a",{parentName:"p",href:"#types-of-nodes"},"archive mode")," when validating. To support the full state, use the\n",(0,r.kt)("inlineCode",{parentName:"p"},"--pruning")," flag:"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Polkadot"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "My node\'s name" --pruning archive\n')),(0,r.kt)("p",null,"It is possible to almost quadruple synchronization speed by using an additional flag:\n",(0,r.kt)("inlineCode",{parentName:"p"},"--wasm-execution Compiled"),". Note that this uses much more CPU and RAM, so it should be turned off\nafter the node syncs."),(0,r.kt)("h2",{id:"using-docker"},"Using Docker"),(0,r.kt)("p",null,"Finally, you can use Docker to run your node in a container. Doing this is more advanced, so it's\nbest left up to those already familiar with docker or who have completed the other set-up\ninstructions in this guide. Be aware that when you run polkadot in docker, the process only listens\non localhost by default. If you would like to connect to your node's services (rpc, and prometheus)\nyou need to ensure that you run you node with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-external"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"--prometheus-external"),"\ncommands."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-zsh"},'docker run -p 9944:9944 -p 9615:9615 parity/polkadot:v0.9.13 --name "calling_home_from_a_docker_container" --rpc-external --prometheus-external\n')))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4200fe5.9be785ac.js b/assets/js/f4200fe5.9be785ac.js deleted file mode 100644 index 3348a526379f..000000000000 --- a/assets/js/f4200fe5.9be785ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2909],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=o,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||r;return a?n.createElement(h,l(l({ref:t},p),{},{components:a})):n.createElement(h,l({ref:t},p))}));function h(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=a.length,l=new Array(r);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:o,l[1]=i;for(var u=2;u{a.d(t,{Z:()=>l});var n=a(67294),o=a(86010);const r={tabItem:"tabItem_Ymn6"};function l(e){var t=e.children,a=e.hidden,l=e.className;return n.createElement("div",{role:"tabpanel",className:(0,o.Z)(r.tabItem,l),hidden:a},t)}},74866:(e,t,a)=>{a.d(t,{Z:()=>v});var n=a(87462),o=a(67294),r=a(86010),l=a(12466),i=a(16550),s=a(91980),u=a(67392),p=a(50012);function d(e){return function(e){var t,a;return null!=(t=null==(a=o.Children.map(e,(function(e){if(!e||(0,o.isValidElement)(e)&&(t=e.props)&&"object"==typeof t&&"value"in t)return e;var t;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.')})))?void 0:a.filter(Boolean))?t:[]}(e).map((function(e){var t=e.props;return{value:t.value,label:t.label,attributes:t.attributes,default:t.default}}))}function c(e){var t=e.values,a=e.children;return(0,o.useMemo)((function(){var e=null!=t?t:d(a);return function(e){var t=(0,u.l)(e,(function(e,t){return e.value===t.value}));if(t.length>0)throw new Error('Docusaurus error: Duplicate values "'+t.map((function(e){return e.value})).join(", ")+'" found in . Every value needs to be unique.')}(e),e}),[t,a])}function m(e){var t=e.value;return e.tabValues.some((function(e){return e.value===t}))}function h(e){var t=e.queryString,a=void 0!==t&&t,n=e.groupId,r=(0,i.k6)(),l=function(e){var t=e.queryString,a=void 0!==t&&t,n=e.groupId;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!n)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 null!=n?n:null}({queryString:a,groupId:n});return[(0,s._X)(l),(0,o.useCallback)((function(e){if(l){var t=new URLSearchParams(r.location.search);t.set(l,e),r.replace(Object.assign({},r.location,{search:t.toString()}))}}),[l,r])]}function k(e){var t,a,n,r,l=e.defaultValue,i=e.queryString,s=void 0!==i&&i,u=e.groupId,d=c(e),k=(0,o.useState)((function(){return function(e){var t,a=e.defaultValue,n=e.tabValues;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(a){if(!m({value:a,tabValues:n}))throw new Error('Docusaurus error: The has a defaultValue "'+a+'" but none of its children has the corresponding value. Available values are: '+n.map((function(e){return e.value})).join(", ")+". If you intend to show no default tab, use defaultValue={null} instead.");return a}var o=null!=(t=n.find((function(e){return e.default})))?t:n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:l,tabValues:d})})),b=k[0],f=k[1],g=h({queryString:s,groupId:u}),y=g[0],N=g[1],v=(t=function(e){return e?"docusaurus.tab."+e:null}({groupId:u}.groupId),a=(0,p.Nk)(t),n=a[0],r=a[1],[n,(0,o.useCallback)((function(e){t&&r.set(e)}),[t,r])]),w=v[0],T=v[1],C=function(){var e=null!=y?y:w;return m({value:e,tabValues:d})?e:null}();return(0,o.useLayoutEffect)((function(){C&&f(C)}),[C]),{selectedValue:b,selectValue:(0,o.useCallback)((function(e){if(!m({value:e,tabValues:d}))throw new Error("Can't select invalid tab value="+e);f(e),N(e),T(e)}),[N,T,d]),tabValues:d}}var b=a(72389);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function g(e){var t=e.className,a=e.block,i=e.selectedValue,s=e.selectValue,u=e.tabValues,p=[],d=(0,l.o5)().blockElementScrollPositionUntilNextRender,c=function(e){var t=e.currentTarget,a=p.indexOf(t),n=u[a].value;n!==i&&(d(t),s(n))},m=function(e){var t,a=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":var n,o=p.indexOf(e.currentTarget)+1;a=null!=(n=p[o])?n:p[0];break;case"ArrowLeft":var r,l=p.indexOf(e.currentTarget)-1;a=null!=(r=p[l])?r:p[p.length-1]}null==(t=a)||t.focus()};return o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":a},t)},u.map((function(e){var t=e.value,a=e.label,l=e.attributes;return o.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:function(e){return p.push(e)},onKeyDown:m,onClick:c},l,{className:(0,r.Z)("tabs__item",f.tabItem,null==l?void 0:l.className,{"tabs__item--active":i===t})}),null!=a?a:t)})))}function y(e){var t=e.lazy,a=e.children,n=e.selectedValue,r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){var l=r.find((function(e){return e.props.value===n}));return l?(0,o.cloneElement)(l,{className:"margin-top--md"}):null}return o.createElement("div",{className:"margin-top--md"},r.map((function(e,t){return(0,o.cloneElement)(e,{key:t,hidden:e.props.value!==n})})))}function N(e){var t=k(e);return o.createElement("div",{className:(0,r.Z)("tabs-container",f.tabList)},o.createElement(g,(0,n.Z)({},e,t)),o.createElement(y,(0,n.Z)({},e,t)))}function v(e){var t=(0,b.Z)();return o.createElement(N,(0,n.Z)({key:String(t)},e))}},31101:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>b,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),l=a(74866),i=a(85162),s=["components"],u={id:"maintain-sync",title:"Set up a Full Node",sidebar_label:"Set up a Full Node",description:"Steps on how to set up a full node.",keywords:["node","full node","sync","setup node"],slug:"../maintain-sync"},p=void 0,d={unversionedId:"maintain/maintain-sync",id:"maintain/maintain-sync",title:"Set up a Full Node",description:"Steps on how to set up a full node.",source:"@site/../docs/maintain/maintain-sync.md",sourceDirName:"maintain",slug:"/maintain-sync",permalink:"/docs/maintain-sync",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-sync.md",tags:[],version:"current",lastUpdatedBy:"Dominique",lastUpdatedAt:1694979058,formattedLastUpdatedAt:"Sep 17, 2023",frontMatter:{id:"maintain-sync",title:"Set up a Full Node",sidebar_label:"Set up a Full Node",description:"Steps on how to set up a full node.",keywords:["node","full node","sync","setup node"],slug:"../maintain-sync"},sidebar:"docs",previous:{title:"Node Endpoints",permalink:"/docs/maintain-endpoints"},next:{title:"Set up a Boot Node",permalink:"/docs/maintain-bootnode"}},c={},m=[{value:"Types of Nodes",id:"types-of-nodes",level:3},{value:"Setup Instructions",id:"setup-instructions",level:2},{value:"Debian-based (Debian, Ubuntu)",id:"debian-based-debian-ubuntu",level:3},{value:"RPM-based (Fedora, CentOS)",id:"rpm-based-fedora-centos",level:3},{value:"Get Substrate",id:"get-substrate",level:2},{value:"Clone and Build",id:"clone-and-build",level:2},{value:"Run",id:"run",level:2},{value:"Running an Archive Node",id:"running-an-archive-node",level:2},{value:"Using Docker",id:"using-docker",level:2}],h={toc:m},k="wrapper";function b(e){var t=e.components,a=(0,o.Z)(e,s);return(0,r.kt)(k,(0,n.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"If you're building dApps or products on a Substrate-based chain like Polkadot, Kusama, or a custom\nSubstrate implementation, you want the ability to run a node-as-a-back-end. After all, relying on\nyour infrastructure is always better than a third-party-hosted one in this brave new decentralized\nworld."),(0,r.kt)("p",null,"This guide will show you how to connect to ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/"},"Polkadot network"),", but the\nsame process applies to any other ",(0,r.kt)("a",{parentName:"p",href:"https://substrate.io"},"Substrate"),"-based chain. First, let's\nclarify the term ",(0,r.kt)("em",{parentName:"p"},"full node"),"."),(0,r.kt)("h3",{id:"types-of-nodes"},"Types of Nodes"),(0,r.kt)("p",null,"A blockchain's growth comes from a ",(0,r.kt)("em",{parentName:"p"},"genesis block"),", ",(0,r.kt)("em",{parentName:"p"},"extrinsics"),", and ",(0,r.kt)("em",{parentName:"p"},"events"),"."),(0,r.kt)("p",null,"When a validator seals block 1, it takes the blockchain's state at block 0. It then applies all\npending changes on top of it and emits the events resulting from these changes. Later, the chain\u2019s\nstate at block one is used the same way to build the chain\u2019s state at block 2, and so on. Once\ntwo-thirds of the validators agree on a specific block being valid, it is finalized."),(0,r.kt)("p",null,"An ",(0,r.kt)("strong",{parentName:"p"},"archive node")," keeps all the past blocks and their states. An archive node makes it convenient\nto query the past state of the chain at any point in time. Finding out what an account's balance at\na particular block was or which extrinsics resulted in a specific state change are fast operations\nwhen using an archive node. However, an archive node takes up a lot of disk space - around Kusama's\n12 millionth block, this was around 660 GB."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"On the ",(0,r.kt)("a",{parentName:"p",href:"https://paranodes.io/DBSize"},"Paranodes")," or ",(0,r.kt)("a",{parentName:"p",href:"https://stakeworld.io/docs/dbsize"},"Stakeworld"),"\nwebsites, you can find lists of the database sizes of Polkadot and Kusama nodes.")),(0,r.kt)("p",null,"Archive nodes are used by utilities that need past information - like block explorers, council\nscanners, discussion platforms like ",(0,r.kt)("a",{parentName:"p",href:"https://polkassembly.io"},"Polkassembly"),", and others. They need\nto be able to look at past on-chain data."),(0,r.kt)("p",null,"A ",(0,r.kt)("strong",{parentName:"p"},"full node")," prunes historical states: all finalized blocks' states older than a configurable\nnumber except the genesis block's state. This is 256 blocks from the last finalized one by default.\nA pruned node this way requires much less space than an archive node."),(0,r.kt)("p",null,"A full node could eventually rebuild every block's state without additional information and become\nan archive node. This still needs to be implemented at the time of writing. If you need to query\nhistorical blocks' states past what you pruned, you must purge your database and resync your node,\nstarting in archive mode. Alternatively, you can use a backup or snapshot of a trusted source to\navoid needing to sync from genesis with the network and only need the states of blocks past that\nsnapshot."),(0,r.kt)("p",null,"Full nodes allow you to read the current state of the chain and to submit and validate extrinsics\ndirectly on the network without relying on a centralized infrastructure provider."),(0,r.kt)("p",null,"Another type of node is a ",(0,r.kt)("strong",{parentName:"p"},"light node"),". A light node has only the runtime and the current state\nbut does not store past blocks and so cannot read historical data without requesting it from a node\nthat has it. Light nodes are useful for resource-restricted devices. An interesting use-case of\nlight nodes is a browser extension, which is a node in its own right, running the runtime in WASM\nformat, as well as a full or light node that is completely encapsulated in WASM and can be\nintegrated into web apps: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/smoldot#wasm-light-node"},"https://github.com/paritytech/smoldot#wasm-light-node"),"."),(0,r.kt)("admonition",{title:"Substrate Connect",type:"note"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-connect"},"Substrate Connect")," provides a way to interact with\nsubstrate-based blockchains in the browser without using an RPC server. It is a light node that runs\nentirely in Javascript. Substrate Connect uses a\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/smoldot"},"smoldot WASM light client")," to securely connect to the\nblockchain network without relying on specific 3rd parties. Substrate Connect is available on Chrome\nand Firefox as a ",(0,r.kt)("a",{parentName:"p",href:"https://substrate.io/developers/substrate-connect/"},"browser extension"),".")),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"setup-instructions"},"Setup Instructions"),(0,r.kt)("p",null,"This is not recommended if you're a validator. Please see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator setup")," if you are running validator."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"The bash commands that are provided to run against ",(0,r.kt)("strong",{parentName:"mdxAdmonitionTitle"},"your node")," use ",(0,r.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"Polkadot")," as the"),(0,r.kt)("p",{parentName:"admonition"},"default chain"),(0,r.kt)("p",{parentName:"admonition"},"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--chain")," flag if you follow the setup instructions to setup a ",(0,r.kt)("inlineCode",{parentName:"p"},"Kusama")," node. For example:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name" --chain kusama\n'))),(0,r.kt)(l.Z,{groupId:"operating-systems",values:[{label:"macOS",value:"mac"},{label:"Windows",value:"win"},{label:"Linux (standalone)",value:"linux-standalone"},{label:"Linux (package)",value:"linux-package"}],mdxType:"Tabs"},(0,r.kt)(i.Z,{value:"mac",mdxType:"TabItem"},(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install Homebrew within the terminal by running:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Then, run:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"brew install openssl cmake llvm protobuf\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install Rust by running:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"After Rust is installed, update and add the nightly version:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Ensure the current shell has cargo\nsource ~/.cargo/env\n\n# Update the Rust toolchain\nrustup default stable\nrustup update\n\n# Add the nightly and WebAssembly targets:\nrustup update nightly\nrustup target add wasm32-unknown-unknown --toolchain nightly\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Verify your installation by running the following:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rustup show\n\n# You should see output similar to:\n\nactive toolchain\n----------------\n\nstable-aarch64-apple-darwin (default)\nrustc 1.68.1 (8460ca823 2023-03-20)\n")),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"rustup +nightly show\n\n# You should see output similar to:\n\ninstalled targets for active toolchain\n--------------------------------------\n\naarch64-apple-darwin\nwasm32-unknown-unknown\n\nactive toolchain\n----------------\n\nnightly-aarch64-apple-darwin (overridden by +toolchain on the command line)\nrustc 1.71.0-nightly (9ecda8de8 2023-04-30)\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Once Rust is configured, run the following command to clone and build the Polkadot code:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/paritytech/polkadot polkadot\ncd polkadot\n./scripts/init.sh\ncargo build --release\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Start your node:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Find your node on ",(0,r.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot"},"Telemetry"))))),(0,r.kt)(i.Z,{value:"win",mdxType:"TabItem"},(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install ",(0,r.kt)("a",{parentName:"p",href:"https://docs.microsoft.com/en-us/windows/wsl/install-win10"},"WSL"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install ",(0,r.kt)("a",{parentName:"p",href:"https://docs.microsoft.com/en-us/windows/wsl/install-win10"},"Ubuntu")," (same webpage).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Determine the latest version of the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases"},"Polkadot binary"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Download the correct Polkadot binary within Ubuntu by running the following command. Replace\n",(0,r.kt)("inlineCode",{parentName:"p"},"*VERSION*")," with the tag of the latest version from the last step (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"v0.8.22"),"):"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"curl -sL https://github.com/paritytech/polkadot/releases/download/*VERSION*/polkadot -o polkadot\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Then, run the following:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo chmod +x polkadot\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Start your node:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./polkadot --name "Your Node\'s Name"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Find your node on ",(0,r.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot"},"Telemetry"))))),(0,r.kt)(i.Z,{value:"linux-standalone",mdxType:"TabItem"},(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Determine the latest version of the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases"},"Polkadot binary"),"."),(0,r.kt)("admonition",{parentName:"li",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The nature of pre-built binaries means that they may not work on your particular architecture or\nLinux distribution. If you see an error like ",(0,r.kt)("inlineCode",{parentName:"p"},"cannot execute binary file: Exec format error")," it\nlikely means the binary is not compatible with your system. You will either need to compile the\n",(0,r.kt)("a",{parentName:"p",href:"#clone-and-build"},(0,r.kt)("strong",{parentName:"a"},"source code"))," or use ",(0,r.kt)("a",{parentName:"p",href:"#using-docker"},(0,r.kt)("strong",{parentName:"a"},"Docker")),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Download the correct Polkadot binary within Ubuntu by running the following command. Replace\n",(0,r.kt)("inlineCode",{parentName:"p"},"*VERSION*")," with the tag of the latest version from the last step (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"v0.8.22"),"):"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"curl -sL https://github.com/paritytech/polkadot/releases/download/*VERSION*/polkadot -o polkadot\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Run the following: ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo chmod +x polkadot"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Run the following:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Find your node on ",(0,r.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot"},"Telemetry"))))),(0,r.kt)(i.Z,{value:"linux-package",mdxType:"TabItem"},(0,r.kt)("p",null,"You can also install Polkadot from one of our package repositories."),(0,r.kt)("p",null,"Installation from the Debian or rpm repositories will create a ",(0,r.kt)("inlineCode",{parentName:"p"},"systemd")," service that can be used to\nrun a Polkadot node. The service is disabled by default, and can be started by running\n",(0,r.kt)("inlineCode",{parentName:"p"},"systemctl start polkadot")," on demand (use ",(0,r.kt)("inlineCode",{parentName:"p"},"systemctl enable polkadot")," to make it auto-start after\nreboot). By default, it will run as the ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot")," user. Command-line flags passed to the binary can\nbe customized by editing ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/default/polkadot"),". This file will not be overwritten on updating\npolkadot."),(0,r.kt)("h3",{id:"debian-based-debian-ubuntu"},"Debian-based (Debian, Ubuntu)"),(0,r.kt)("p",null,"Currently supports Debian 10 (Buster) and Ubuntu 20.04 (Focal), and derivatives. Run the following\ncommands as the ",(0,r.kt)("inlineCode",{parentName:"p"},"root")," user."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Import the security@parity.io GPG key\ngpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798\ngpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg\n# Add the Parity repository and update the package index\necho 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list\napt update\n# Install the `parity-keyring` package - This will ensure the GPG key\n# used by APT remains up-to-date\napt install parity-keyring\n# Install polkadot\napt install polkadot\n\n")),(0,r.kt)("p",null,"If you don't want polkadot package to be automatically updated when you update packages on your\nserver, you can issue the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt-mark hold polkadot\n")),(0,r.kt)("h3",{id:"rpm-based-fedora-centos"},"RPM-based (Fedora, CentOS)"),(0,r.kt)("p",null,"Currently supports Fedora 32 and CentOS 8, and derivatives."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Install dnf-plugins-core (This might already be installed)\ndnf install dnf-plugins-core\n# Add the repository and enable it\ndnf config-manager --add-repo https://releases.parity.io/rpm/polkadot.repo\ndnf config-manager --set-enabled polkadot\n# Install polkadot (You may have to confirm the import of the GPG key, which\n# should have the following fingerprint: 9D4B2B6EB8F97156D19669A9FF0812D491B96798)\ndnf install polkadot\n")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If you choose to use a custom folder for the polkadot home by passing ",(0,r.kt)("inlineCode",{parentName:"p"},"--base-path '/custom-path'"),",\nyou will need to issue following command:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo mkdir /etc/systemd/system/polkadot.service.d\n")),(0,r.kt)("p",{parentName:"admonition"},"And create a new file inside this folder:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo -e /etc/systemd/system/polkadot.service.d/custom.conf\n")),(0,r.kt)("p",{parentName:"admonition"},"With the following content:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre"},"[Service]\nReadWritePaths=/custom-path\n")),(0,r.kt)("p",{parentName:"admonition"},"And finally issue a reload to have your modifications applied by systemd:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"systemctl daemon-reload\n"))))),(0,r.kt)("h2",{id:"get-substrate"},"Get Substrate"),(0,r.kt)("p",null,"Follow instructions as outlined ",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/quick-start/"},"here")," - note that Windows\nusers will have their work cut out for them. It's better to use a virtual machine instead."),(0,r.kt)("p",null,"Test if the installation was successful by running ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo --version"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"\u03bb cargo --version\ncargo 1.41.0 (626f0f40e 2019-12-03)\n")),(0,r.kt)("h2",{id:"clone-and-build"},"Clone and Build"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot"},"paritytech/polkadot")," repo's master branch contains the\nlatest Polkadot code."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/paritytech/polkadot polkadot\ncd polkadot\n./scripts/init.sh\ncargo build --release\n")),(0,r.kt)("p",null,"Alternatively, if you wish to use a specific release, you can check out a specific tag (",(0,r.kt)("inlineCode",{parentName:"p"},"v0.8.3")," in\nthe example below):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/paritytech/polkadot polkadot\ncd polkadot\ngit checkout tags/v0.8.3\n./scripts/init.sh\ncargo build --release\n")),(0,r.kt)("h2",{id:"run"},"Run"),(0,r.kt)("p",null,"The built binary will be in the ",(0,r.kt)("inlineCode",{parentName:"p"},"target/release")," folder, called ",(0,r.kt)("inlineCode",{parentName:"p"},"polkadot"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Polkadot"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "Your Node\'s Name"\n')),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"--help")," flag to determine which flags you can use when running the node. For example, if\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-wss"},"connecting to your node remotely"),", you'll probably want to use ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-external")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-cors all"),"."),(0,r.kt)("p",null,"The syncing process will take a while, depending on your capacity, processing power, disk speed and\nRAM. On a \\$10 DigitalOcean droplet, the process can complete in some 36 hours."),(0,r.kt)("p",null,"Congratulations, you're now syncing with Polkadot. Keep in mind that the process is identical when\nusing any other Substrate chain."),(0,r.kt)("h2",{id:"running-an-archive-node"},"Running an Archive Node"),(0,r.kt)("p",null,"When running as a simple sync node (above), only the state of the past 256 blocks will be kept. It\ndefaults to ",(0,r.kt)("a",{parentName:"p",href:"#types-of-nodes"},"archive mode")," when validating. To support the full state, use the\n",(0,r.kt)("inlineCode",{parentName:"p"},"--pruning")," flag:"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Polkadot"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'./target/release/polkadot --name "My node\'s name" --pruning archive\n')),(0,r.kt)("p",null,"It is possible to almost quadruple synchronization speed by using an additional flag:\n",(0,r.kt)("inlineCode",{parentName:"p"},"--wasm-execution Compiled"),". Note that this uses much more CPU and RAM, so it should be turned off\nafter the node syncs."),(0,r.kt)("h2",{id:"using-docker"},"Using Docker"),(0,r.kt)("p",null,"Finally, you can use Docker to run your node in a container. Doing this is more advanced, so it's\nbest left up to those already familiar with docker or who have completed the other set-up\ninstructions in this guide. Be aware that when you run polkadot in docker, the process only listens\non localhost by default. If you would like to connect to your node's services (rpc, and\nprometheus) you need to ensure that you run you node with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--rpc-external"),", and\n",(0,r.kt)("inlineCode",{parentName:"p"},"--prometheus-external")," commands."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-zsh"},'docker run -p 9944:9944 -p 9615:9615 parity/polkadot:v0.9.13 --name "calling_home_from_a_docker_container" --rpc-external --prometheus-external\n')))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.64809b51.js b/assets/js/runtime~main.4f23dbac.js similarity index 97% rename from assets/js/runtime~main.64809b51.js rename to assets/js/runtime~main.4f23dbac.js index 7d7bd68fd157..e1b45dfe5781 100644 --- a/assets/js/runtime~main.64809b51.js +++ b/assets/js/runtime~main.4f23dbac.js @@ -1 +1 @@ -(()=>{"use strict";var e,c,f,a,b={},d={};function r(e){var c=d[e];if(void 0!==c)return c.exports;var f=d[e]={id:e,loaded:!1,exports:{}};return b[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=b,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/"+({1:"f4fb6e9c",6:"408829bd",12:"1d6d4797",53:"935f2afb",63:"9f319605",192:"f189ca9f",217:"c7a044bb",250:"f2717f8e",315:"9528ac88",502:"2d429218",537:"3829cf1d",601:"0c06bca3",609:"d569989b",626:"79d4be33",657:"386bfe51",691:"145746f5",785:"04a995e6",810:"23498fd5",1062:"f90fa732",1083:"899aadcc",1090:"cfd53ea4",1211:"73c3bebc",1213:"25f2bd2a",1239:"f359a251",1288:"fabebe44",1299:"74df6a22",1372:"b61f6dc7",1415:"4d76887f",1419:"f750c690",1446:"5136ee31",1481:"4dff184a",1486:"8dd7cee0",1494:"b21dd8a7",1506:"c977dfe8",1529:"ffe9c3c9",1585:"33b0bcab",1592:"b336bb09",1598:"7fbac68a",1678:"fa343ad1",1686:"f7191335",1703:"a5002e4a",1723:"0df78d26",1748:"987d08ef",1774:"9e6341e5",1786:"d9ef69a7",1825:"48074a08",1872:"78e1e977",1953:"1ed3671a",1957:"df154d69",1966:"f47489cd",1979:"0cb62240",2008:"4f031749",2042:"dd32e389",2078:"84f79495",2117:"21877fa5",2136:"ecb495b7",2169:"1646726c",2194:"6151e7ce",2242:"f3027c84",2248:"da9f79cb",2354:"493c7fdf",2399:"8d3a1bf8",2483:"d6d2b2d5",2505:"9a101178",2507:"7c78c461",2508:"918b38b6",2552:"863c4753",2665:"f4130007",2677:"ece9fdae",2704:"f3bde756",2712:"c2c6a3a6",2754:"78868b16",2758:"9e3f6a8a",2791:"7d54ab5a",2884:"5d69d9d4",2909:"f4200fe5",2914:"2be0d940",2949:"2ea50c63",3066:"af40287e",3132:"85afe03a",3262:"8a8a7d05",3330:"e31fc461",3332:"3497b7c6",3347:"32dac8d4",3348:"7ccc428f",3356:"f14351c1",3484:"5c90fc9b",3513:"41b7b3e8",3554:"d5909206",3599:"21899dd2",3620:"f137ce68",3635:"75a6958b",3665:"f1585bfb",3667:"b0cbc1d4",3668:"b225a2ce",3669:"dbbd9e76",3757:"bea375d6",3842:"ff6596ea",3933:"cda87995",3944:"fac80962",4004:"ec3b6a32",4097:"eef3f1dd",4105:"702d5d94",4174:"a7c27f4d",4195:"c4f5d8e4",4355:"19ed4d4c",4363:"f2c21b54",4379:"c662f00a",4428:"991ceaa9",4445:"4d9b9869",4476:"f4003c83",4507:"a7b37b86",4537:"1ae2b102",4541:"3e56470e",4543:"295fff6c",4566:"694e7470",4620:"48d75399",4634:"54338ffb",4666:"f41c4e9d",4672:"43ee4f22",4696:"1dc05242",4909:"f0855ff9",4916:"c1bbdb2a",5005:"320c8a05",5011:"7e9389ad",5013:"c41801b5",5103:"db039c7f",5157:"d27ae88d",5281:"31bd35e0",5422:"b3719d54",5483:"f7acb151",5492:"1882e65d",5526:"0c68fb82",5548:"d6b0148d",5651:"9e2042f5",5704:"b9b4ec9e",5989:"fbf58567",6104:"c7c5ba1a",6140:"32e8da05",6220:"d01f45b7",6253:"a29dc56e",6255:"452ad91d",6277:"a62d9768",6294:"bbba852d",6312:"dbc4065c",6357:"43cda9e8",6373:"ceaa29cb",6482:"49816380",6585:"13b7bafa",6598:"ca9fe671",6689:"f2521980",6730:"fea93377",6776:"666ba125",6827:"279fb1d6",6862:"60e73337",6918:"29a046f3",6920:"ccc1222e",6946:"4642ab5c",7022:"543610b9",7061:"feea648c",7202:"4a8eb552",7211:"f44ed8f8",7280:"fbea1897",7288:"6f1a81b8",7368:"bb8b1738",7388:"bd701914",7466:"a5b3561d",7485:"d3db551a",7633:"b940de31",7654:"c07c2447",7683:"cc44e8fd",7778:"41871d53",7799:"8b670b2b",7823:"9e76b49d",7830:"15985664",7837:"0a3f0c9b",7858:"d6a97e7e",7908:"33bbe353",7918:"17896441",7920:"1a4e3797",7940:"ad762f86",7961:"a2800a5b",8034:"fecdcc34",8067:"69b97ecd",8080:"77a2b809",8115:"8247eba8",8138:"694672cd",8139:"386099fc",8178:"9a679a70",8215:"30d868e8",8236:"ffd76171",8270:"12331e8b",8355:"c91a9c06",8361:"824749c6",8618:"e4f3654b",8648:"71ed82b9",8702:"a74a59a0",8757:"83d4859f",8791:"ab138bf8",8831:"3bd77df4",8855:"d3a753cf",8860:"766a10e1",8866:"98a30fd8",8876:"31c99aa1",8901:"b48c599b",9062:"b38833d4",9071:"60738e36",9112:"a4b71220",9126:"924835c1",9217:"64c7e1cc",9226:"2f3b630e",9247:"8167490d",9276:"e344dd79",9315:"6d2ffbf3",9323:"131c7f55",9383:"a996ffc3",9478:"c7a2145e",9514:"1be78505",9548:"f95cee6f",9626:"32c9742a",9764:"dc776cbc",9779:"cd144357",9802:"1e15616a",9806:"51fbc2c9",9817:"14eb3368",9905:"b0cb055f",9993:"482bfb5c"}[e]||e)+"."+{1:"5563b650",6:"1f73546c",12:"1d49c46e",53:"bf0ad7e8",63:"4e5acc1b",192:"2ac0e4f9",217:"0102c432",250:"11cfd82d",315:"91b1b4b8",502:"a61433f2",537:"2aa85719",601:"fdd54faa",609:"7ea29085",626:"04fdcb9b",657:"f5513d14",691:"057bf6a6",785:"8b77bad6",810:"f1f880b6",1062:"b8388f11",1083:"ac5baa92",1090:"26932415",1211:"38ccdcd9",1213:"fee6731f",1239:"229ef67b",1288:"a5dae372",1299:"7dda7011",1372:"4867e413",1415:"68f49da4",1419:"3038c1cd",1446:"2265d608",1481:"ef6db1ae",1486:"b802faeb",1494:"06ba09e6",1506:"13ff4738",1529:"0405f413",1585:"e1ec66d3",1592:"5581008d",1598:"280b23d8",1678:"fd4b34be",1686:"a70a88a6",1703:"11033614",1723:"679d1be0",1748:"7ec544f5",1774:"1c405b46",1786:"6a2d15ec",1825:"7886665d",1872:"342366ba",1953:"e4392cf0",1957:"20d04add",1966:"159ec2ae",1979:"6d282955",2008:"669ef6b1",2042:"4a47eb43",2078:"17164550",2117:"0d3bcf09",2136:"dbf5ae7f",2169:"f5054254",2194:"dc7e4b47",2242:"bc90566c",2248:"f8b898cb",2354:"0549539a",2399:"ce4dc016",2483:"e1906e64",2505:"93f7a5dc",2507:"1df35914",2508:"2c796861",2552:"6484aed3",2665:"6a103f96",2677:"ef946730",2704:"c83746c5",2712:"f34d1bcc",2754:"82d7eade",2758:"0f86507c",2791:"e6f92028",2859:"0e95b965",2884:"3b223315",2909:"9be785ac",2914:"4e1b0dc1",2949:"7738f0eb",3066:"2d6ba895",3132:"85a16703",3262:"d7f83aec",3330:"f8f9d28c",3332:"59059207",3347:"cbbdbed4",3348:"f38102d7",3356:"92ca1efd",3484:"e60b3258",3513:"06973ce4",3554:"6dc12371",3599:"e4d7458a",3620:"c1d05422",3635:"380802aa",3665:"fb1d42b5",3667:"e0070afc",3668:"b34aa74c",3669:"127bb89f",3757:"bc4ede3b",3842:"e0217335",3933:"72a66ef4",3944:"cb771eab",4004:"5b01424d",4097:"8a90e754",4105:"3b4a799e",4174:"ed65611d",4195:"66467c10",4355:"2d9fa8b7",4363:"e88e5818",4379:"2d13fe17",4428:"ddbb74cc",4445:"6f8db23a",4476:"56dd0533",4507:"bed350d5",4537:"c965ef47",4541:"978ae83c",4543:"d644a3e2",4566:"ab0d60ad",4620:"d02a17da",4634:"96f31519",4666:"13717c6f",4672:"4490d71c",4696:"27d5f43b",4909:"3ae4713d",4916:"4b3a7688",4972:"2c004fcc",5005:"2dd41bcb",5011:"98b0975e",5013:"da533e91",5103:"3f268ad3",5157:"899f2267",5281:"6761b31b",5422:"122d7519",5483:"daef5619",5492:"7b10a32b",5526:"20b79d53",5548:"e68f018e",5651:"fd035fbc",5704:"70bd0ba6",5989:"0fdc298d",6104:"73115fbd",6140:"3f8e8ef0",6220:"8b344451",6253:"fe535738",6255:"8509f60e",6277:"a769d3bc",6294:"b077023f",6312:"ed91dbbd",6316:"86a075e6",6357:"6a6a3bfc",6373:"b8a24443",6482:"888c2030",6495:"4071f460",6585:"a296816a",6598:"5f760aa9",6689:"da309741",6730:"52c45925",6776:"0a7bd7c5",6780:"35cedf78",6827:"3fb13981",6862:"494b1047",6918:"61dac2e1",6920:"c6b123d5",6945:"96d36007",6946:"62348511",7022:"083a8378",7061:"89e327b0",7202:"795d2adc",7211:"bf56e06e",7280:"306e56e9",7288:"59752a80",7368:"77d8ddea",7388:"53d48c10",7466:"6c38d255",7485:"82d47cfd",7633:"201e1d4c",7654:"2f612a3d",7683:"cea920b9",7724:"05bda7f2",7778:"8da5b4da",7799:"5d0c65da",7823:"6c8a30f2",7830:"a2703576",7837:"b9260b47",7858:"f9862ed2",7908:"0da511b2",7918:"9afca7e1",7920:"56c00901",7940:"51168990",7961:"c0d1b031",8034:"dca0d1af",8067:"af36ecc3",8080:"af8fd37a",8115:"2ebb714e",8138:"ee8c3c6d",8139:"7c760262",8178:"62f5ed0b",8215:"775d309b",8236:"63fecdb9",8270:"1dd5ba80",8355:"860edaec",8361:"5c7bc601",8618:"f5896277",8648:"34316a10",8702:"123441bd",8757:"4f1ee155",8791:"b8ed3a5e",8831:"16eb75ba",8855:"9d00af7a",8860:"48171767",8866:"4bdda915",8876:"a30609d2",8894:"ba661129",8901:"cc3ae736",9062:"9cc9144f",9071:"0695351a",9112:"38b794db",9126:"97ed5095",9217:"d87f81ce",9226:"ef78d4f2",9247:"a0154dc8",9276:"c9f1c397",9315:"d5006aa3",9323:"affc597b",9383:"983557bc",9447:"4797b942",9478:"8f4b04f5",9487:"ca8bca46",9514:"d9fbec79",9548:"f095b5ce",9626:"b43c6d01",9764:"012ce7bf",9779:"4c7efdf9",9802:"11684b0f",9806:"c3977137",9817:"beb63dbf",9905:"3e1ce1bd",9993:"98eb3afc"}[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={},r.l=(e,c,f,b)=>{if(a[e])a[e].push(c);else{var d,t;if(void 0!==f)for(var o=document.getElementsByTagName("script"),n=0;n{d.onerror=d.onload=null,clearTimeout(u);var b=a[e];if(delete a[e],d.parentNode&&d.parentNode.removeChild(d),b&&b.forEach((e=>e(f))),c)return c(f)},u=setTimeout(l.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=l.bind(null,d.onerror),d.onload=l.bind(null,d.onload),t&&document.head.appendChild(d)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={15985664:"7830",17896441:"7918",49816380:"6482",f4fb6e9c:"1","408829bd":"6","1d6d4797":"12","935f2afb":"53","9f319605":"63",f189ca9f:"192",c7a044bb:"217",f2717f8e:"250","9528ac88":"315","2d429218":"502","3829cf1d":"537","0c06bca3":"601",d569989b:"609","79d4be33":"626","386bfe51":"657","145746f5":"691","04a995e6":"785","23498fd5":"810",f90fa732:"1062","899aadcc":"1083",cfd53ea4:"1090","73c3bebc":"1211","25f2bd2a":"1213",f359a251:"1239",fabebe44:"1288","74df6a22":"1299",b61f6dc7:"1372","4d76887f":"1415",f750c690:"1419","5136ee31":"1446","4dff184a":"1481","8dd7cee0":"1486",b21dd8a7:"1494",c977dfe8:"1506",ffe9c3c9:"1529","33b0bcab":"1585",b336bb09:"1592","7fbac68a":"1598",fa343ad1:"1678",f7191335:"1686",a5002e4a:"1703","0df78d26":"1723","987d08ef":"1748","9e6341e5":"1774",d9ef69a7:"1786","48074a08":"1825","78e1e977":"1872","1ed3671a":"1953",df154d69:"1957",f47489cd:"1966","0cb62240":"1979","4f031749":"2008",dd32e389:"2042","84f79495":"2078","21877fa5":"2117",ecb495b7:"2136","1646726c":"2169","6151e7ce":"2194",f3027c84:"2242",da9f79cb:"2248","493c7fdf":"2354","8d3a1bf8":"2399",d6d2b2d5:"2483","9a101178":"2505","7c78c461":"2507","918b38b6":"2508","863c4753":"2552",f4130007:"2665",ece9fdae:"2677",f3bde756:"2704",c2c6a3a6:"2712","78868b16":"2754","9e3f6a8a":"2758","7d54ab5a":"2791","5d69d9d4":"2884",f4200fe5:"2909","2be0d940":"2914","2ea50c63":"2949",af40287e:"3066","85afe03a":"3132","8a8a7d05":"3262",e31fc461:"3330","3497b7c6":"3332","32dac8d4":"3347","7ccc428f":"3348",f14351c1:"3356","5c90fc9b":"3484","41b7b3e8":"3513",d5909206:"3554","21899dd2":"3599",f137ce68:"3620","75a6958b":"3635",f1585bfb:"3665",b0cbc1d4:"3667",b225a2ce:"3668",dbbd9e76:"3669",bea375d6:"3757",ff6596ea:"3842",cda87995:"3933",fac80962:"3944",ec3b6a32:"4004",eef3f1dd:"4097","702d5d94":"4105",a7c27f4d:"4174",c4f5d8e4:"4195","19ed4d4c":"4355",f2c21b54:"4363",c662f00a:"4379","991ceaa9":"4428","4d9b9869":"4445",f4003c83:"4476",a7b37b86:"4507","1ae2b102":"4537","3e56470e":"4541","295fff6c":"4543","694e7470":"4566","48d75399":"4620","54338ffb":"4634",f41c4e9d:"4666","43ee4f22":"4672","1dc05242":"4696",f0855ff9:"4909",c1bbdb2a:"4916","320c8a05":"5005","7e9389ad":"5011",c41801b5:"5013",db039c7f:"5103",d27ae88d:"5157","31bd35e0":"5281",b3719d54:"5422",f7acb151:"5483","1882e65d":"5492","0c68fb82":"5526",d6b0148d:"5548","9e2042f5":"5651",b9b4ec9e:"5704",fbf58567:"5989",c7c5ba1a:"6104","32e8da05":"6140",d01f45b7:"6220",a29dc56e:"6253","452ad91d":"6255",a62d9768:"6277",bbba852d:"6294",dbc4065c:"6312","43cda9e8":"6357",ceaa29cb:"6373","13b7bafa":"6585",ca9fe671:"6598",f2521980:"6689",fea93377:"6730","666ba125":"6776","279fb1d6":"6827","60e73337":"6862","29a046f3":"6918",ccc1222e:"6920","4642ab5c":"6946","543610b9":"7022",feea648c:"7061","4a8eb552":"7202",f44ed8f8:"7211",fbea1897:"7280","6f1a81b8":"7288",bb8b1738:"7368",bd701914:"7388",a5b3561d:"7466",d3db551a:"7485",b940de31:"7633",c07c2447:"7654",cc44e8fd:"7683","41871d53":"7778","8b670b2b":"7799","9e76b49d":"7823","0a3f0c9b":"7837",d6a97e7e:"7858","33bbe353":"7908","1a4e3797":"7920",ad762f86:"7940",a2800a5b:"7961",fecdcc34:"8034","69b97ecd":"8067","77a2b809":"8080","8247eba8":"8115","694672cd":"8138","386099fc":"8139","9a679a70":"8178","30d868e8":"8215",ffd76171:"8236","12331e8b":"8270",c91a9c06:"8355","824749c6":"8361",e4f3654b:"8618","71ed82b9":"8648",a74a59a0:"8702","83d4859f":"8757",ab138bf8:"8791","3bd77df4":"8831",d3a753cf:"8855","766a10e1":"8860","98a30fd8":"8866","31c99aa1":"8876",b48c599b:"8901",b38833d4:"9062","60738e36":"9071",a4b71220:"9112","924835c1":"9126","64c7e1cc":"9217","2f3b630e":"9226","8167490d":"9247",e344dd79:"9276","6d2ffbf3":"9315","131c7f55":"9323",a996ffc3:"9383",c7a2145e:"9478","1be78505":"9514",f95cee6f:"9548","32c9742a":"9626",dc776cbc:"9764",cd144357:"9779","1e15616a":"9802","51fbc2c9":"9806","14eb3368":"9817",b0cb055f:"9905","482bfb5c":"9993"}[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,t,o]=f,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={};function r(e){var c=d[e];if(void 0!==c)return c.exports;var f=d[e]={id:e,loaded:!1,exports:{}};return b[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=b,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/"+({1:"f4fb6e9c",6:"408829bd",12:"1d6d4797",53:"935f2afb",63:"9f319605",192:"f189ca9f",217:"c7a044bb",250:"f2717f8e",315:"9528ac88",502:"2d429218",537:"3829cf1d",601:"0c06bca3",609:"d569989b",626:"79d4be33",657:"386bfe51",691:"145746f5",785:"04a995e6",810:"23498fd5",1062:"f90fa732",1083:"899aadcc",1090:"cfd53ea4",1211:"73c3bebc",1213:"25f2bd2a",1239:"f359a251",1288:"fabebe44",1299:"74df6a22",1372:"b61f6dc7",1415:"4d76887f",1419:"f750c690",1446:"5136ee31",1481:"4dff184a",1486:"8dd7cee0",1494:"b21dd8a7",1506:"c977dfe8",1529:"ffe9c3c9",1585:"33b0bcab",1592:"b336bb09",1598:"7fbac68a",1678:"fa343ad1",1686:"f7191335",1703:"a5002e4a",1723:"0df78d26",1748:"987d08ef",1774:"9e6341e5",1786:"d9ef69a7",1825:"48074a08",1872:"78e1e977",1953:"1ed3671a",1957:"df154d69",1966:"f47489cd",1979:"0cb62240",2008:"4f031749",2042:"dd32e389",2078:"84f79495",2117:"21877fa5",2136:"ecb495b7",2169:"1646726c",2194:"6151e7ce",2242:"f3027c84",2248:"da9f79cb",2354:"493c7fdf",2399:"8d3a1bf8",2483:"d6d2b2d5",2505:"9a101178",2507:"7c78c461",2508:"918b38b6",2552:"863c4753",2665:"f4130007",2677:"ece9fdae",2704:"f3bde756",2712:"c2c6a3a6",2754:"78868b16",2758:"9e3f6a8a",2791:"7d54ab5a",2884:"5d69d9d4",2909:"f4200fe5",2914:"2be0d940",2949:"2ea50c63",3066:"af40287e",3132:"85afe03a",3262:"8a8a7d05",3330:"e31fc461",3332:"3497b7c6",3347:"32dac8d4",3348:"7ccc428f",3356:"f14351c1",3484:"5c90fc9b",3513:"41b7b3e8",3554:"d5909206",3599:"21899dd2",3620:"f137ce68",3635:"75a6958b",3665:"f1585bfb",3667:"b0cbc1d4",3668:"b225a2ce",3669:"dbbd9e76",3757:"bea375d6",3842:"ff6596ea",3933:"cda87995",3944:"fac80962",4004:"ec3b6a32",4097:"eef3f1dd",4105:"702d5d94",4174:"a7c27f4d",4195:"c4f5d8e4",4355:"19ed4d4c",4363:"f2c21b54",4379:"c662f00a",4428:"991ceaa9",4445:"4d9b9869",4476:"f4003c83",4507:"a7b37b86",4537:"1ae2b102",4541:"3e56470e",4543:"295fff6c",4566:"694e7470",4620:"48d75399",4634:"54338ffb",4666:"f41c4e9d",4672:"43ee4f22",4696:"1dc05242",4909:"f0855ff9",4916:"c1bbdb2a",5005:"320c8a05",5011:"7e9389ad",5013:"c41801b5",5103:"db039c7f",5157:"d27ae88d",5281:"31bd35e0",5422:"b3719d54",5483:"f7acb151",5492:"1882e65d",5526:"0c68fb82",5548:"d6b0148d",5651:"9e2042f5",5704:"b9b4ec9e",5989:"fbf58567",6104:"c7c5ba1a",6140:"32e8da05",6220:"d01f45b7",6253:"a29dc56e",6255:"452ad91d",6277:"a62d9768",6294:"bbba852d",6312:"dbc4065c",6357:"43cda9e8",6373:"ceaa29cb",6482:"49816380",6585:"13b7bafa",6598:"ca9fe671",6689:"f2521980",6730:"fea93377",6776:"666ba125",6827:"279fb1d6",6862:"60e73337",6918:"29a046f3",6920:"ccc1222e",6946:"4642ab5c",7022:"543610b9",7061:"feea648c",7202:"4a8eb552",7211:"f44ed8f8",7280:"fbea1897",7288:"6f1a81b8",7368:"bb8b1738",7388:"bd701914",7466:"a5b3561d",7485:"d3db551a",7633:"b940de31",7654:"c07c2447",7683:"cc44e8fd",7778:"41871d53",7799:"8b670b2b",7823:"9e76b49d",7830:"15985664",7837:"0a3f0c9b",7858:"d6a97e7e",7908:"33bbe353",7918:"17896441",7920:"1a4e3797",7940:"ad762f86",7961:"a2800a5b",8034:"fecdcc34",8067:"69b97ecd",8080:"77a2b809",8115:"8247eba8",8138:"694672cd",8139:"386099fc",8178:"9a679a70",8215:"30d868e8",8236:"ffd76171",8270:"12331e8b",8355:"c91a9c06",8361:"824749c6",8618:"e4f3654b",8648:"71ed82b9",8702:"a74a59a0",8757:"83d4859f",8791:"ab138bf8",8831:"3bd77df4",8855:"d3a753cf",8860:"766a10e1",8866:"98a30fd8",8876:"31c99aa1",8901:"b48c599b",9062:"b38833d4",9071:"60738e36",9112:"a4b71220",9126:"924835c1",9217:"64c7e1cc",9226:"2f3b630e",9247:"8167490d",9276:"e344dd79",9315:"6d2ffbf3",9323:"131c7f55",9383:"a996ffc3",9478:"c7a2145e",9514:"1be78505",9548:"f95cee6f",9626:"32c9742a",9764:"dc776cbc",9779:"cd144357",9802:"1e15616a",9806:"51fbc2c9",9817:"14eb3368",9905:"b0cb055f",9993:"482bfb5c"}[e]||e)+"."+{1:"5563b650",6:"1f73546c",12:"1d49c46e",53:"bf0ad7e8",63:"4e5acc1b",192:"2ac0e4f9",217:"0102c432",250:"11cfd82d",315:"91b1b4b8",502:"a61433f2",537:"2aa85719",601:"fdd54faa",609:"7ea29085",626:"04fdcb9b",657:"f5513d14",691:"057bf6a6",785:"8b77bad6",810:"f1f880b6",1062:"b8388f11",1083:"ac5baa92",1090:"26932415",1211:"38ccdcd9",1213:"fee6731f",1239:"229ef67b",1288:"a5dae372",1299:"7dda7011",1372:"4867e413",1415:"68f49da4",1419:"3038c1cd",1446:"2265d608",1481:"ef6db1ae",1486:"b802faeb",1494:"06ba09e6",1506:"13ff4738",1529:"0405f413",1585:"e1ec66d3",1592:"5581008d",1598:"280b23d8",1678:"fd4b34be",1686:"a70a88a6",1703:"11033614",1723:"679d1be0",1748:"7ec544f5",1774:"1c405b46",1786:"6a2d15ec",1825:"7886665d",1872:"342366ba",1953:"e4392cf0",1957:"20d04add",1966:"159ec2ae",1979:"6d282955",2008:"669ef6b1",2042:"4a47eb43",2078:"17164550",2117:"0d3bcf09",2136:"dbf5ae7f",2169:"f5054254",2194:"dc7e4b47",2242:"bc90566c",2248:"f8b898cb",2354:"cb8f9adb",2399:"ce4dc016",2483:"e1906e64",2505:"93f7a5dc",2507:"1df35914",2508:"2c796861",2552:"6484aed3",2665:"6a103f96",2677:"ef946730",2704:"c83746c5",2712:"f34d1bcc",2754:"82d7eade",2758:"0f86507c",2791:"e6f92028",2859:"0e95b965",2884:"3b223315",2909:"025c4bbe",2914:"4e1b0dc1",2949:"7738f0eb",3066:"2d6ba895",3132:"85a16703",3262:"d7f83aec",3330:"f8f9d28c",3332:"59059207",3347:"cbbdbed4",3348:"f38102d7",3356:"92ca1efd",3484:"e60b3258",3513:"06973ce4",3554:"6dc12371",3599:"e4d7458a",3620:"c1d05422",3635:"380802aa",3665:"fb1d42b5",3667:"e0070afc",3668:"b34aa74c",3669:"127bb89f",3757:"bc4ede3b",3842:"e0217335",3933:"72a66ef4",3944:"cb771eab",4004:"5b01424d",4097:"8a90e754",4105:"3b4a799e",4174:"ed65611d",4195:"66467c10",4355:"2d9fa8b7",4363:"e88e5818",4379:"2d13fe17",4428:"ddbb74cc",4445:"6f8db23a",4476:"56dd0533",4507:"bed350d5",4537:"c965ef47",4541:"978ae83c",4543:"d644a3e2",4566:"ab0d60ad",4620:"d02a17da",4634:"96f31519",4666:"13717c6f",4672:"4490d71c",4696:"27d5f43b",4909:"3ae4713d",4916:"4b3a7688",4972:"2c004fcc",5005:"2dd41bcb",5011:"98b0975e",5013:"da533e91",5103:"3f268ad3",5157:"899f2267",5281:"6761b31b",5422:"122d7519",5483:"daef5619",5492:"7b10a32b",5526:"20b79d53",5548:"e68f018e",5651:"fd035fbc",5704:"70bd0ba6",5989:"0fdc298d",6104:"73115fbd",6140:"3f8e8ef0",6220:"8b344451",6253:"fe535738",6255:"8509f60e",6277:"a769d3bc",6294:"b077023f",6312:"ed91dbbd",6316:"86a075e6",6357:"6a6a3bfc",6373:"b8a24443",6482:"888c2030",6495:"4071f460",6585:"a296816a",6598:"5f760aa9",6689:"da309741",6730:"52c45925",6776:"0a7bd7c5",6780:"35cedf78",6827:"3fb13981",6862:"494b1047",6918:"61dac2e1",6920:"b0446c32",6945:"96d36007",6946:"62348511",7022:"083a8378",7061:"89e327b0",7202:"795d2adc",7211:"bf56e06e",7280:"306e56e9",7288:"59752a80",7368:"77d8ddea",7388:"53d48c10",7466:"6c38d255",7485:"82d47cfd",7633:"201e1d4c",7654:"2f612a3d",7683:"7de880dc",7724:"05bda7f2",7778:"8da5b4da",7799:"5d0c65da",7823:"6c8a30f2",7830:"a2703576",7837:"b9260b47",7858:"f9862ed2",7908:"0da511b2",7918:"9afca7e1",7920:"56c00901",7940:"42bdb48e",7961:"c0d1b031",8034:"dca0d1af",8067:"af36ecc3",8080:"af8fd37a",8115:"2ebb714e",8138:"ee8c3c6d",8139:"7c760262",8178:"62f5ed0b",8215:"775d309b",8236:"63fecdb9",8270:"1dd5ba80",8355:"860edaec",8361:"5c7bc601",8618:"f5896277",8648:"34316a10",8702:"18f93eb1",8757:"4f1ee155",8791:"b8ed3a5e",8831:"16eb75ba",8855:"9d00af7a",8860:"48171767",8866:"4bdda915",8876:"a30609d2",8894:"ba661129",8901:"cc3ae736",9062:"9cc9144f",9071:"0695351a",9112:"38b794db",9126:"97ed5095",9217:"d87f81ce",9226:"ef78d4f2",9247:"a0154dc8",9276:"c9f1c397",9315:"d5006aa3",9323:"affc597b",9383:"983557bc",9447:"4797b942",9478:"8f4b04f5",9487:"ca8bca46",9514:"d9fbec79",9548:"f095b5ce",9626:"b43c6d01",9764:"012ce7bf",9779:"4c7efdf9",9802:"11684b0f",9806:"c3977137",9817:"beb63dbf",9905:"3e1ce1bd",9993:"98eb3afc"}[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={},r.l=(e,c,f,b)=>{if(a[e])a[e].push(c);else{var d,t;if(void 0!==f)for(var o=document.getElementsByTagName("script"),n=0;n{d.onerror=d.onload=null,clearTimeout(u);var b=a[e];if(delete a[e],d.parentNode&&d.parentNode.removeChild(d),b&&b.forEach((e=>e(f))),c)return c(f)},u=setTimeout(l.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=l.bind(null,d.onerror),d.onload=l.bind(null,d.onload),t&&document.head.appendChild(d)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={15985664:"7830",17896441:"7918",49816380:"6482",f4fb6e9c:"1","408829bd":"6","1d6d4797":"12","935f2afb":"53","9f319605":"63",f189ca9f:"192",c7a044bb:"217",f2717f8e:"250","9528ac88":"315","2d429218":"502","3829cf1d":"537","0c06bca3":"601",d569989b:"609","79d4be33":"626","386bfe51":"657","145746f5":"691","04a995e6":"785","23498fd5":"810",f90fa732:"1062","899aadcc":"1083",cfd53ea4:"1090","73c3bebc":"1211","25f2bd2a":"1213",f359a251:"1239",fabebe44:"1288","74df6a22":"1299",b61f6dc7:"1372","4d76887f":"1415",f750c690:"1419","5136ee31":"1446","4dff184a":"1481","8dd7cee0":"1486",b21dd8a7:"1494",c977dfe8:"1506",ffe9c3c9:"1529","33b0bcab":"1585",b336bb09:"1592","7fbac68a":"1598",fa343ad1:"1678",f7191335:"1686",a5002e4a:"1703","0df78d26":"1723","987d08ef":"1748","9e6341e5":"1774",d9ef69a7:"1786","48074a08":"1825","78e1e977":"1872","1ed3671a":"1953",df154d69:"1957",f47489cd:"1966","0cb62240":"1979","4f031749":"2008",dd32e389:"2042","84f79495":"2078","21877fa5":"2117",ecb495b7:"2136","1646726c":"2169","6151e7ce":"2194",f3027c84:"2242",da9f79cb:"2248","493c7fdf":"2354","8d3a1bf8":"2399",d6d2b2d5:"2483","9a101178":"2505","7c78c461":"2507","918b38b6":"2508","863c4753":"2552",f4130007:"2665",ece9fdae:"2677",f3bde756:"2704",c2c6a3a6:"2712","78868b16":"2754","9e3f6a8a":"2758","7d54ab5a":"2791","5d69d9d4":"2884",f4200fe5:"2909","2be0d940":"2914","2ea50c63":"2949",af40287e:"3066","85afe03a":"3132","8a8a7d05":"3262",e31fc461:"3330","3497b7c6":"3332","32dac8d4":"3347","7ccc428f":"3348",f14351c1:"3356","5c90fc9b":"3484","41b7b3e8":"3513",d5909206:"3554","21899dd2":"3599",f137ce68:"3620","75a6958b":"3635",f1585bfb:"3665",b0cbc1d4:"3667",b225a2ce:"3668",dbbd9e76:"3669",bea375d6:"3757",ff6596ea:"3842",cda87995:"3933",fac80962:"3944",ec3b6a32:"4004",eef3f1dd:"4097","702d5d94":"4105",a7c27f4d:"4174",c4f5d8e4:"4195","19ed4d4c":"4355",f2c21b54:"4363",c662f00a:"4379","991ceaa9":"4428","4d9b9869":"4445",f4003c83:"4476",a7b37b86:"4507","1ae2b102":"4537","3e56470e":"4541","295fff6c":"4543","694e7470":"4566","48d75399":"4620","54338ffb":"4634",f41c4e9d:"4666","43ee4f22":"4672","1dc05242":"4696",f0855ff9:"4909",c1bbdb2a:"4916","320c8a05":"5005","7e9389ad":"5011",c41801b5:"5013",db039c7f:"5103",d27ae88d:"5157","31bd35e0":"5281",b3719d54:"5422",f7acb151:"5483","1882e65d":"5492","0c68fb82":"5526",d6b0148d:"5548","9e2042f5":"5651",b9b4ec9e:"5704",fbf58567:"5989",c7c5ba1a:"6104","32e8da05":"6140",d01f45b7:"6220",a29dc56e:"6253","452ad91d":"6255",a62d9768:"6277",bbba852d:"6294",dbc4065c:"6312","43cda9e8":"6357",ceaa29cb:"6373","13b7bafa":"6585",ca9fe671:"6598",f2521980:"6689",fea93377:"6730","666ba125":"6776","279fb1d6":"6827","60e73337":"6862","29a046f3":"6918",ccc1222e:"6920","4642ab5c":"6946","543610b9":"7022",feea648c:"7061","4a8eb552":"7202",f44ed8f8:"7211",fbea1897:"7280","6f1a81b8":"7288",bb8b1738:"7368",bd701914:"7388",a5b3561d:"7466",d3db551a:"7485",b940de31:"7633",c07c2447:"7654",cc44e8fd:"7683","41871d53":"7778","8b670b2b":"7799","9e76b49d":"7823","0a3f0c9b":"7837",d6a97e7e:"7858","33bbe353":"7908","1a4e3797":"7920",ad762f86:"7940",a2800a5b:"7961",fecdcc34:"8034","69b97ecd":"8067","77a2b809":"8080","8247eba8":"8115","694672cd":"8138","386099fc":"8139","9a679a70":"8178","30d868e8":"8215",ffd76171:"8236","12331e8b":"8270",c91a9c06:"8355","824749c6":"8361",e4f3654b:"8618","71ed82b9":"8648",a74a59a0:"8702","83d4859f":"8757",ab138bf8:"8791","3bd77df4":"8831",d3a753cf:"8855","766a10e1":"8860","98a30fd8":"8866","31c99aa1":"8876",b48c599b:"8901",b38833d4:"9062","60738e36":"9071",a4b71220:"9112","924835c1":"9126","64c7e1cc":"9217","2f3b630e":"9226","8167490d":"9247",e344dd79:"9276","6d2ffbf3":"9315","131c7f55":"9323",a996ffc3:"9383",c7a2145e:"9478","1be78505":"9514",f95cee6f:"9548","32c9742a":"9626",dc776cbc:"9764",cd144357:"9779","1e15616a":"9802","51fbc2c9":"9806","14eb3368":"9817",b0cb055f:"9905","482bfb5c":"9993"}[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,t,o]=f,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 - + @@ -30,7 +30,7 @@ core team members, and gain access to Polkadot events.

There are many ways you can get involved in expanding Polkadot’s ecosystem, such as:

  • Contributing code and documentation related to the ecosystem
  • Speaking about Polkadot at events, workshops, and meetups
  • Writing blog posts
  • Representing Polkadot in your region
  • Mentoring and onboarding newcomers
  • Identifying partnerships and opportunities for the Polkadot ecosystem
  • Participating in calls and tasks that help drive the ecosystem forward

How to apply:

To become a Polkadot Ambassador, please fill out your application here.

Find out more about the programme and how to join here.

- + \ No newline at end of file diff --git a/docs/bug-bounty.html b/docs/bug-bounty.html index c7f940bcad14..eabbe15b114c 100644 --- a/docs/bug-bounty.html +++ b/docs/bug-bounty.html @@ -19,7 +19,7 @@ - + @@ -43,7 +43,7 @@ not to be disruptive or harmful to our users or us. Otherwise, your actions might be interpreted as an attack rather than an effort to be helpful.

How to report a bug

Please follow the instructions at web3.foundation/security-report/.

- + \ No newline at end of file diff --git a/docs/build-data.html b/docs/build-data.html index 13ceb41f086a..5ed553c9488c 100644 --- a/docs/build-data.html +++ b/docs/build-data.html @@ -19,7 +19,7 @@ - + @@ -47,7 +47,7 @@ recorded in smart contracts that are often not accessible.

Polkadot-based Explorers

As you can imagine, blockchain explorers also offer data analytics through an interface where users can examine common data points.

Some block explorers in the Polkadot ecosystem are listed on the tools page.

- + \ No newline at end of file diff --git a/docs/build-guide.html b/docs/build-guide.html index b5b670356e3e..355cbb095470 100644 --- a/docs/build-guide.html +++ b/docs/build-guide.html @@ -19,7 +19,7 @@ - + @@ -139,7 +139,7 @@ ecosystem contains various SDKs to tap into the relay chain and parachains.

For front-end applications, several options exist for interfacing with Substrate-based chains (parachains, relay chains, etc.) and smart contracts. These often will interact with the RPC of a Substrate node:

Promise and RxJS APIs around Polkadot and Substrate based chains via RPC calls. It is dynamically generated based on what the Substrate runtime provides in terms of metadata. Full documentation & examples available.

For a full list of tools please take a look here: Tools, APIs and Languages

- + \ No newline at end of file diff --git a/docs/build-hackathon.html b/docs/build-hackathon.html index fbc4592c9004..f8a1d457040a 100644 --- a/docs/build-hackathon.html +++ b/docs/build-hackathon.html @@ -19,7 +19,7 @@ - + @@ -46,7 +46,7 @@ that can be a feature of you hackathon or suggested prerequisite for those joining to use.

Support / Contact

If you have any questions regarding organizing a hackathon, please free feel to contact us by email or ask us via Element chat.

- + \ No newline at end of file diff --git a/docs/build-hrmp-channels.html b/docs/build-hrmp-channels.html index ab62b9ac7d99..560a330cd68c 100644 --- a/docs/build-hrmp-channels.html +++ b/docs/build-hrmp-channels.html @@ -19,7 +19,7 @@ - + @@ -59,7 +59,7 @@ encourage the community to vote on this, highlighting the benefits for your chain, use cases enabled with this submission, among other things. After the enactment period is over, both chains will authorize the channel.

- + \ No newline at end of file diff --git a/docs/build-index.html b/docs/build-index.html index d9bc58854085..d0d5330bd3a3 100644 --- a/docs/build-index.html +++ b/docs/build-index.html @@ -19,7 +19,7 @@ - + @@ -39,7 +39,7 @@ are building.

Grants

  • Grants - Information regarding grants and funding sources available in the Polkadot ecosystem.

PCPs

Polkadot Contracts Proposals (PCPs) are standards for smart contracts in the Polkadot ecosystem.

Hackathon

- + \ No newline at end of file diff --git a/docs/build-integrate-assets.html b/docs/build-integrate-assets.html index e198d4939eb8..c605f1bb8827 100644 --- a/docs/build-integrate-assets.html +++ b/docs/build-integrate-assets.html @@ -19,7 +19,7 @@ - + @@ -73,7 +73,7 @@ constructing parachain transactions, you can use txwrapper-polkadot exactly as on the Relay Chain, but would construct transactions with the appropriate parachain metadata like genesis hash, spec version, and type registry.

- + \ No newline at end of file diff --git a/docs/build-integration.html b/docs/build-integration.html index f9615b7756d6..4a8875864705 100644 --- a/docs/build-integration.html +++ b/docs/build-integration.html @@ -19,7 +19,7 @@ - + @@ -42,7 +42,7 @@ transactions. Parity and Web3 Foundation will be able to provide the best support if you use these tools.

If your team would like support, join some of our community channels or contact support@polkadot.network.

- + \ No newline at end of file diff --git a/docs/build-node-interaction.html b/docs/build-node-interaction.html index afed70f7b3c9..4f85d9f0d030 100644 --- a/docs/build-node-interaction.html +++ b/docs/build-node-interaction.html @@ -19,7 +19,7 @@ - + @@ -57,7 +57,7 @@ block by the block author.

{
"number":"7409038",
"hash":"0x0e9610f3c89fac046ef83aa625ad414d5403031faa026b7ab2a918184e389968",
"parentHash":"0xba308541eb207bc639f36d392706309a031c21622f883fb07411060389c5ffdd",
"stateRoot":"0x4426383b64a944ad7222a4019aefd558c749da0c6920cfcdfd587741d54abbe2",
"extrinsicsRoot":"0x74749e5f5aeb610bc23fd6d8d79fd8bbf5e4b6053f70ba94ea6b3cc271df4b3a",
"authorId":"Fvvz6Ej1D5ZR5ZTK1vE1dCjBvkbxE1VncptEtmFaecXe4PF",
"logs":[
{
"type":"PreRuntime",
"index":"6",
"value":[
"BABE",
"0x023a0200009c7d191000000000"
]
},
{
"type":"Seal",
"index":"5",
"value":[
"BABE",
"0x2296a50fa4fea3a46a95ad5b1f09de76d22c6ed3dc6755718c976e2d14c63e4dd3c6257813d9bdc03bb180b1e20393f1558ae1204982e5c7570df393e11f908b"
]
}
],
"onInitialize":{
"events":[

]
},
"extrinsics":[
{
"method":{
"pallet":"timestamp",
"method":"set"
},
"signature":null,
"nonce":null,
"args":{
"now":"1620636072000"
},
"tip":null,
"hash":"0x8b853f49b6543e4fcbc796ad3574ea5601d2869d80629e080e501da4cb7b74b4",
"info":{

},
"events":[
{
"method":{
"pallet":"system",
"method":"ExtrinsicSuccess"
},
"data":[
{
"weight":"185253000",
"class":"Mandatory",
"paysFee":"Yes"
}
]
}
],
"success":true,
"paysFee":false
},
{
"method":{
"pallet":"balances",
"method":"transfer"
},
"signature":{
"signature":"0x94b63112648e8e692f0076fa1ccab3a04510c269d1392c1df2560503865e144e3afd578f1e37e98063b64b98a77a89a9cdc8ade579dcac0984e78d90646a052001",
"signer":{
"id":"Gr5sBB1EgdmQ7FG3Ud2BdECWQTMDXNgGPfdHMMtDsmT4Dj3"
}
},
"nonce":"12",
"args":{
"dest":{
"id":"J6ksma2jVeHRcRoYPZBkJRzRbckys7oSmgvjKLrVbj1U8bE"
},
"value":"100000000"
},
"tip":"0",
"hash":"0xfbc5e5de75d64abe5aa3ee9272a3112b3ce53710664f6f2b9416b2ffda8799c2",
"info":{
"weight":"201217000",
"class":"Normal",
"partialFee":"2583332634"
},
"events":[
{
"method":{
"pallet":"balances",
"method":"Transfer"
},
"data":[
"Gr5sBB1EgdmQ7FG3Ud2BdECWQTMDXNgGPfdHMMtDsmT4Dj3",
"J6ksma2jVeHRcRoYPZBkJRzRbckys7oSmgvjKLrVbj1U8bE",
"100000000"
]
},
{
"method":{
"pallet":"balances",
"method":"Deposit"
},
"data":[
"Fvvz6Ej1D5ZR5ZTK1vE1dCjBvkbxE1VncptEtmFaecXe4PF",
"2583332634"
]
},
{
"method":{
"pallet":"system",
"method":"ExtrinsicSuccess"
},
"data":[
{
"weight":"201217000",
"class":"Normal",
"paysFee":"Yes"
}
]
}
],
"success":true,
"paysFee":true
},
{
"method":{
"pallet":"utility",
"method":"batch"
},
"signature":{
"signature":"0x8aa2fc3f0cff52533745679523705720cff42d0e7258b9797feed193deb0ca73474726e148af0a0b096d44c07f20e5292819ec92279cffb2897e95cc337e638e",
"signer":{
"id":"F4gmSZGiM9pMYPsKW7xnGktDr4zRmN2jqy5Ze678y9YWR7F"
}
},
"nonce":"687",
"args":{
"calls":[
{
"method":{
"pallet":"staking",
"method":"payoutStakers"
},
"args":{
"validator_stash":"Cfish3zJiFnTvR9jscCap7imeA9ep3cH1wZfcZwAp2gdZHo",
"era":"2229"
}
},
{
"method":{
"pallet":"staking",
"method":"payoutStakers"
},
"args":{
"validator_stash":"Cfish3zJiFnTvR9jscCap7imeA9ep3cH1wZfcZwAp2gdZHo",
"era":"2230"
}
},
{
"method":{
"pallet":"staking",
"method":"payoutStakers"
},
"args":{
"validator_stash":"Cfish3zJiFnTvR9jscCap7imeA9ep3cH1wZfcZwAp2gdZHo",
"era":"2231"
}
},
{
"method":{
"pallet":"staking",
"method":"payoutStakers"
},
"args":{
"validator_stash":"DifishR4auphofhzxsy2aupgYo4NaUECH7qgt71CgiB2o6P",
"era":"2231"
}
},
{
"method":{
"pallet":"staking",
"method":"payoutStakers"
},
"args":{
"validator_stash":"J1fishfH94nFZLNScHgC2HorWpFD2xdPxd96wtTCHLvKxfa",
"era":"2231"
}
}
]
},
"tip":"0",
"hash":"0x69171ec3f4e5e4dfd27f4d1c5b5dbc884932c5d9a078c84495bb7ab875c8785f",
"info":{
"weight":"629782467000",
"class":"Normal",
"partialFee":"5150837715"
},
"events":[
{
"method":{
"pallet":"staking",
"method":"Reward"
},
"data":[
"Cfish3zJiFnTvR9jscCap7imeA9ep3cH1wZfcZwAp2gdZHo",
"40730624074"
]
},
{
"method":{
"pallet":"staking",
"method":"Reward"
},
"data":[
"FhLcXuFkTwyc3o9K82VBahpain1YHWyGeNMDTTyeDJKfm5b",
"4296071738"
]
},
{
"method":{
"pallet":"staking",
"method":"Reward"
},
"data":[
"F1NyXFUayqmVMdjNK45hcaTCE3JiqdU83sEGhQ3HQXn2Rpq",
"1770904403"
]
},

// ...

{
"method":{
"pallet":"utility",
"method":"BatchCompleted"
},
"data":[

]
},
{
"method":{
"pallet":"balances",
"method":"Deposit"
},
"data":[
"Fvvz6Ej1D5ZR5ZTK1vE1dCjBvkbxE1VncptEtmFaecXe4PF",
"5150837715"
]
},
{
"method":{
"pallet":"system",
"method":"ExtrinsicSuccess"
},
"data":[
{
"weight":"629782467000",
"class":"Normal",
"paysFee":"Yes"
}
]
}
],
"success":true,
"paysFee":true
}
],
"onFinalize":{
"events":[

]
},
"finalized":true
}
The JS number type is a 53 bit precision float

There is no guarantee that the numerical values in the response will have a numerical type. Any numbers larger than 2**53-1 will have a string type.

Submitting a Transaction

Submit a serialized transaction using the transaction endpoint with an HTTP POST request.

import requests
import json

url = 'http://127.0.0.1:8080/transaction/'
tx_headers = {'Content-type' : 'application/json', 'Accept' : 'text/plain'}
response = requests.post(
url,
data='{"tx": "0xed0...000"}', # A serialized tx.
headers=tx_headers
)
tx_response = json.loads(response.text)

If successful, this endpoint returns a JSON with the transaction hash. In case of error, it will return an error report, e.g.:

{
"error": "Failed to parse a tx" | "Failed to submit a tx",
"cause": "Upstream error description"
}
- + \ No newline at end of file diff --git a/docs/build-node-management.html b/docs/build-node-management.html index 96be274a8b81..179fe43a3ba5 100644 --- a/docs/build-node-management.html +++ b/docs/build-node-management.html @@ -19,7 +19,7 @@ - + @@ -36,10 +36,9 @@ events are cleared from state in each block, so if you want to store events then you will need an archive node.

Explainer video on upgrading a node

To upgrade a node, please refer to this video

Exporting blocks

To export blocks to a file, use export-blocks. Export in JSON (default) or binary -(--binary true).

polkadot export-blocks --from 0 <output_file>

RPC ports

Use the --rpc-external flag to expose RPC ports. Not all -RPC calls are safe to allow and you should use an RPC proxy to filter unsafe calls. Select ports -with the --rpc-port option. To limit the hosts who can access, use the ---rpc-cors option.

Execution

The Parity Polkadot client implements a Polkadot Host and a +(--binary true).

polkadot export-blocks --from 0 <output_file>

RPC ports

Use the --rpc-external flag to expose RPC ports. Not all RPC calls are safe to allow and you +should use an RPC proxy to filter unsafe calls. Select ports with the --rpc-port option. To limit +the hosts who can access, use the --rpc-cors option.

Execution

The Parity Polkadot client implements a Polkadot Host and a native runtime. The runtime must compile to WebAssembly and is stored on-chain. If the client's runtime is the same spec as the runtime that is stored on-chain, then the client will execute blocks using the client binary. Otherwise, the client will execute the Wasm runtime from the chain.

Therefore, when syncing the chain, the client will execute blocks from past runtimes using their @@ -67,8 +66,8 @@ this Helm chart.

The node also exposes a Prometheus endpoint by default (disable with --no-prometheus). Substrate has a monitor node metrics tutorial -which uses this endpoint.

- +which uses this endpoint.

+ \ No newline at end of file diff --git a/docs/build-open-source.html b/docs/build-open-source.html index a5de0d4b3cbc..ed047713ce12 100644 --- a/docs/build-open-source.html +++ b/docs/build-open-source.html @@ -19,7 +19,7 @@ - + @@ -29,12 +29,12 @@ apologize if we missed your project!


About

The Polkadot Tech Stack is a subset of the Web 3.0 Tech Stack, which consists of the open-source technologies contributing to and relying on Polkadot. It is meant to be used for decentralized application (Dapp) development within numerous verticals, including DeFi, Gaming, -Provenance and many others not pictured below.

|------|--------|------------|
| DeFi | Gaming | Provenance |
|______|________|____________|
Dapps
|--------------------------/-|
| Explorers, Wallets / |
|------------------------/---|
| Tools, Apis, Languages/ |
|----------------------/-----|
| 2nd layer protocols / |
|--------------------/-------|
| Chains / other |
|------------------/--- --|
| *Polkadot* | tech |
|------------------\---------|
| P2P, Crypto, Wasm \ |
|--------------------\-------|

Layers of Polkadot Stack

In the below sections, you can find a list of different layers of the Polkadot Stack.

Maintenance Status:

  • 🟢 Actively maintained
  • 🟡 Stale (no activity on the main branch for one month)
  • ⚪ Unmaintained (no activity on the main branch for more than three months)

Wallets

ComponentsExisting projectsPotentially interesting projects
Web WalletsMultix 🟢, Polkasafe 🟢, polkadot-js/apps 🟢, Talisman Web Application 🟢, mydotwallet 🟡, Sub ID 🟢, Primis ⚪, Sakura ⚪, Web3Box ⚪, Coong Wallet 🟡, Subscan Multisig UI - React 🟡, Subscan Multisig UI ⚪, Dorafactory-Multisig ⚪, Capi Multisig App 🟡User-friendly Wallet based on the Recovery Pallet, Web wallets focused on user-onboarding (e.g. using localStorage), Enterprise Wallets
Desktop Walletsnova-spektr 🟢, Omni desktop
Browser ExtensionsTalisman-Extension 🟢, SubWallet-Extension 🟢, Enkrypt 🟢, Polkadot{.js} 🟢, Polkadot-Js-Plus-Extension ⚪, Doter ⚪, Speckle OS ⚪, Kuma Cross-chain Wallet 🟢Sign-in with your polkadot, kusama, etc. account.
Mobile WalletsAirGap 🟢, SubWallet-Mobile 🟢, Lunie ⚪, Polkawallet ⚪, Parity Signer 🟢, imToken ⚪, Fearless Wallet Android 🟢, Fearless Wallet iOS 🟢, Stylo ⚪, Nova Wallet 🟢, Fractapp ⚪, Interstellar Network 🟡, Hashed Wallet
Burner Wallets/Faucet/Giftsdotdrop 🟡, KodaDot ⚪, Astar Faucet Bot 🟡, Generic sybil-resistant faucet ⚪, sybil-resistant Chat Bot Faucet 🟡Faucet (a sybil-resistant way to receive free tokens)
Wallet PluginsMetamask-Snap by Chainsafe 🟢
CLI WalletSubwallet ⚪, Proxy-hot-wallet
Hardware WalletsLedger Polkadot 🟢, Ledger Kusama 🟡, Ledger Statemint 🟡, Ledger Statemine 🟢Trezor

User Interface

ComponentsExisting projectsPotentially interesting projects
Block ExplorersCalamar 🟢, Polkaholic 🟢, Polkascan ⚪, Polkastats ⚪, Subscan 🟡, Statescan ⚪, Edgscan ⚪, Sirato 🟡, Ink! Explorer API ⚪, Substats ⚪, Hybrid Block Explorer 🟡Mempool focused explorer (including parachain transaction)
Validator DashboardsPolkadot Telemetry 🟡, Polkacube ⚪, YieldScan ⚪, Hubble ⚪, Cyclops 🟢, Web3Go 🟡
Node ExplorersPolkadot Node Explorer
NFT ExplorerNFT Explorer for Kusama & Polkadot 🟢
Governance DashboardsPolkadot Delegation Dashboard 🟢, Polkassembly ⚪, dotreasury 🟢, Bright Treasury ⚪, OpenSquare offchain voting 🟡, OpenGov Insights 🟢UI for the Kusama and/or Polkadot treasury (see bounty module), UI for Parachain Lease Offering (PLO)
StakingStaking Rewards Collector ⚪, Staking Rewards Viewer ⚪, Polkadot Staking Site ⚪, Polkadot Staking Dashboard 🟢, Polkadot/Kusama Validator Selector ⚪, Staking Income CSV Generator
Bridge UIParity Bridges UI ⚪, Donut Interface (Steem - Dot)
Parachain/CrowdloanParachains.Network ⚪, PolkAuction ⚪, Crowdloan Front End Template ⚪, Slothunter 🟢
IdenticonPolkadotWebIdenticon ⚪, Polkadot Angular IdentIcon ⚪, Bird Identicon
OtherKappaSigmaMu Fratority 🟡, Quadratic Funding Webapp ⚪, Polkawatch, Bytepay ⚪, charging-management-platform ⚪, subidentity-webapp ⚪, OpenSquare Paid QA 🟡, DotPulse ⚪, Rubeus Keeper ⚪, Polkaflow ⚪, ChainViz 🟢Portfolio Viewer like Zapper or Zerion

Tools, APIs, and Languages

ComponentsExisting projectsPotentially interesting projects
Runtime/Parachain frameworksPolkadot Blockchain SDK 🟢, Gosemble 🟡, Subsembly ⚪, Parachain utilities ⚪, GantreeTools to create parachains from frameworks used in other ecosystems
Client LibrariesCapi - Typescript 🟢, sub-api 🟢, Go 🟡, .Net ⚪, .NET Standard 2.0 🟢, Substrate .NET Toolchain 🟢, C++ ⚪, C ⚪, Haskell ⚪, Javascript 🟢, Substrate API Sidecar - TypeScript 🟢, Python 🟢, Java (+ Android) ⚪, Substrate Client Java ⚪, Rust SCS 🟡, Rust Parity (subxt) 🟢, Rust pdotc PHP (gmajor-encrypt) ⚪, PHP (neha0921) ⚪, RPC-Ethereum 🟢, Swift 🟢, Kotlin ⚪, substrate-client-kotlin ⚪, substrate-client-swift ⚪, Dart 🟡, Substrate Core Polywrapper 🟢
RPC GatewaySubway 🟢
Substrate Contract clientsPatractGo
Easy Runtime DevelopmentSubalfred 🟢, substrate-stencil ⚪, Play Substrate ⚪, substrate-node-template 🟢, Substrate Playground ⚪, AssemblyScript Runtime Generation ⚪, Substrate Package Manager ⚪, Subsembly: Framework for developing AssemblyScript Substrate Runtimes ⚪, dependency diener 🟢
Easy Smart Contract DevelopmentSwanky-cli 🟢, Typechain Polkadot 🟡, ink-playground 🟡, DRink! 🟢, Ink! Remix Plugin ⚪, Signac ⚪, INK!athon 🟢, ink!-boxes ⚪, ink!-smart-contract-wizard ⚪, Polkadot Contract Wizard 🟢, ink-wrapper 🟡, ink! Analyzer for VS Code 🟢
IDE PluginsInk! Analyzer 🟢, Substrate Marketplace VS Code Plugin ⚪, VS Code Plugin ⚪, Atom Code Plugin ⚪, zombienet extension
Runtime/Pallet SecuritySubstrate Runtime Fuzzer 🟡, Substrate Toml Lint ⚪, K specifications 🟢, PolPatrol - Polkadot Runtime CheckerAutomated Runtime checking tools, economic audit simulator such as gauntlet.network
Smart Contract LanguagesAsk! 🟢, Subscript ⚪, Solang 🟢, Ink! 🟢, pallet-move 🟢, Move VM Substrate ⚪, Move smart contract by Neatcoin ⚪, Sol2Ink 🟡, eBPF Contracts Hackathon ⚪, PolkaVM 🟢Functional Programming Languages, other languages with developed toolchains
Smart Contract SecurityPatron 🟢
TestingPolkadot introspector 🟢, Subshell 🟡, substrate-simnode 🟢, Halva ⚪, Ink Waterfall 🟡, Redspot ⚪, MixBytes Tank ⚪, sub-flood ⚪, Substrate debug-kit ⚪, Dotscale - SCALE Codec Comparator ⚪, Asset CLI tool ⚪, sub_crash ⚪, subwasm 🟢, subsee ⚪, polkadot-lab ⚪, RPC-perf
Static AnalysisSubstrace ⚪, Static analyzer for Substrate FRAME's pallets ⚪, CoinFabrik Scout 🟢
TestnetZombienet 🟢, Chopsticks 🟢, Polkadot Launch ⚪, polkadot-starship ⚪, Fork off Substrate ⚪, try-runtime-cli 🟢, Parachain Launch 🟢
BenchmarkingBenchmarking CLI 🟢, Polkadot sTPS 🟢, Clockchain ⚪, Substrate Graph Benchmarks ⚪, ink! & pallet benchmarking template ⚪, smart-bench 🟡
Blockchain Indexing EngineSquid SDK 🟢, Hybrid Indexer, Substrate Archive ⚪, PSQL Indexer ⚪, Substrate Graph ⚪, Subquery 🟢, MBELT3 🟡, stick 🟢, Hyperdot 🟢
Blockchain/Event MonitoringWeb3 Guardian ⚪, Aurras Event Manager 🟢, @commonwealth/chain-events ⚪, Massbit ⚪, Polkadot Basic Notifications ⚪, Ocelloids 🟡, Tracking Chain 🟢,
GamingCrossbowAmethyst + Substrate
No-code PlatformsEzCode's Polkadot.js plugin on Bubble.io ⚪, Blackprint Visual Programming Polkadot.js module 🟡, SubRelay 🟡
WalletsTalisman Connect ⚪, SubWallet-SubConnect 🟢, Metadata Portal 🟢, Tesseract 🟡, WalletConnect ⚪, BitGoJS 🟢
XCMTrappist 🟢, XCM-tools 🟡, XCM-tools Golang 🟢,ParaSpell 🟡, XBI 🟡, XCM TS/JS SDK
Otherasset-transfer-api 🟢, txwrapper-core 🟢, open-web3 JS library ⚪, VM-Bridge ⚪, srtool 🟢, srtool-cli 🟢, Substrate Tip Bot 🟢, ORI (Onchain Risk Intelligence) ⚪, PolkaTools ⚪, polkadot-scripts ⚪, Sube ⚪, data-store-sidecar ⚪, SugarFunge 🟡, substrate-wasmedge ⚪, EightFish 🟡, Sandox 🟢

ink Smart Contracts

ComponentsExisting projectsPotentially interesting projects
BridgesDante Protocol
DeFiPendulum-Ink-Wrapper, Panorama Swap 🟡, ink_bank ⚪, Polkadot AMM ⚪, Vera ⚪, Nsure Insurance ⚪, Everlasting Cash ⚪, Coinversation ⚪, zenlink-dex-contract ⚪, AlgoCashNew seigniorage-style stable coins
GamingOpen Emoji Battler 🟡, NewOmega
DAOSyncraDAO ⚪, subDAO ⚪, RainbowDAO ⚪, MangoBox ⚪, MangoSale 🟢
Identity/DIDDotflow 🟢
OracleDIA WASM Oracle
Spam ProtectionProsopo
ToolingOpenBrush 🟢
GovernanceAbax Governance 🟢
NFTArtZero
Othermagink 🟢, ink-test-contracts 🟡, Candle Auctions ⚪, polkasign-contract ⚪, OCEX 🟢, Roloi ⚪, OpenPayroll 🟡, BlockchainFoodOrder

Chains and Pallets

ComponentsExisting projectsPotentially interesting projects
Scalable TransactionsPerun channels ⚪, CLI demo of Perun ⚪, Astar 🟢, Celer ⚪, Gunclear ⚪, TPScore 🟢roll-ups, DAG-based consensus mechanisms, side chains
BridgesinterBTC 🟢, DKG Substrate 🟢, Sygma 🟢, EOS by Bifrost ⚪, POA - Substrate ⚪, Substrate - Ethereum DAI Bridge ⚪, Substrate - Substrate Bridge ⚪, BTC by ChainX 🟡, Cosmos-Substrate bridge ⚪, Substrate IBC Pallet ⚪, Polkadot Ethereum Bridge 🟢, Darwinia 🟢, Spacewalk: a Stellar bridge 🟢, Filecoindot ⚪, Axelar-SubstrateZCash
PrivacyZeroChain ⚪, xx network ⚪, pLibra (Phala Network) 🟢, Automata Network ⚪, Zero Network 🟢, Silent DataMulti-Asset Shielded Pool (MASP) , Zkay, Zexe
ZKPZeroPool ⚪, Megaclite ⚪, zkMega ⚪, PLONK for Substrate ⚪, Webb Anchor Protocol 🟡, zk-SNARKs tutorial ⚪, substrate-zk 🟢
TEEAcurast 🟢, Integritee 🟢, substraTEEKeysafe Protocol
DeFiPrivaDEX ⚪, Fusotao 🟢, Reef ⚪, Diora ⚪, Pendulum Chain 🟢, Compound Gateway ⚪, Parallel Finance 🟡, PINT ⚪, Laminar Chain ⚪, Acala 🟢, Centrifuge 🟢, Stafi 🟡, Definex ⚪, OAX Foundation ⚪, Cybex ⚪, Zenlink ⚪, Swaps Pallet ⚪, Polkadex 🟡, SubDEX ⚪, HydraDX 🟢, Substrate Stablecoin ⚪, Standard protocol ⚪, Polkaswap 🟢, Curve AMM ⚪, Konomi Network ⚪, Stable Asset 🟢, Libra Payment ⚪, Mangata 🟢, Tidechain 🟢, Basilisk 🟡, Polymesh 🟢DEX with privacy and confidentiality features such as those found in a dark pool
Smart contract chainsmoonbeam 🟢, Aleph-node 🟢, Edgeware ⚪, ParaState ⚪, gear 🟢, CENNZnet ⚪, SkyeKiwi ⚪, OAK-blockchain 🟢, ICE Blockchain ⚪, Polkadot Smart Chain ⚪, Madara - Cairo/Starknet 🟢smart contract chains with novel security approaches, smart contract chains based on existing toolchains
OracleLaminar 🟢, Chainlink-polkadot ⚪, Ares Protocol ⚪, Kylin Network ⚪, interbtc-clients oracle 🟢, Anonima ⚪, SaaS3 ⚪, Tellor 🟡, Bridgestate Oracle 🟢
Identity/DIDParami ⚪, Litentry 🟢, pallet-did ⚪, dot-id
IoTNodle 🟢, MXC/DataHighway ⚪, peaq-network-node
Verifiable ClaimsKILT 🟢, Dock 🟢, Fennel Protocol 🟡
Supply chainDSCP Node 🟢
Health care
Music IndustryAllfeat Network 🟢
Data AvailabilityAvail 🟢, Melodot 🟢
Social NetworkingFrequency 🟢, Social Network ⚪, SubSocial 🟢, ZeroDAO ⚪, Myriad Node 🟢, Wika Network ⚪, Project Liberty 🟢, Listen ⚪, Tribal Protocol ⚪, Five Degrees on Substrate ⚪, Acuity Social 🟡Private instant messenger that uses on-chain identity
Governance/DAOHashed Network ⚪, Sunshine DAO ⚪, Governance OS ⚪, Idavoll Network ⚪, Substrate Moloch ⚪, QRUCIAL-DAO 🟡, Societal 🟢, DAOs ⚪, Shivarthu 🟢, Faterium 🟢, Supersig ⚪, GenesisDAO 🟢, DAO Entrance 🟡, Liberland 🟡Consul - Open Government and E-Participation Web Software
Prediction Markets and FutarchyZeitgeist 🟢, X Predict Market
MessagingHOPR ⚪, Nolik ⚪, Uke ⚪, Diffy Chat 🟡
File Storage, CloudSubsocial-Offchain 🟢, DatDot ⚪, Crust Network 🟢, offchain::ipfs ⚪, Canyon Network 🟡, CESS 🟢, CESS Proving Subsystem ⚪, Iris ⚪, fmd-cess ⚪, IPFS Frame V3 ⚪, Threefold Chain 🟢, Apron ⚪, IPFS Utilities
Name ServiceSubstrate Names ⚪, ENS on Substrate ⚪, PNS-Pallets ⚪, Faceless ⚪, Anchor 🟢
GamingBit.country 🟡, SubGame ⚪, subzero ⚪, Web3Games 🟢, Ajuna Network 🟢, Gafi Network ⚪, Asylum 🟢, 3DPass 🟢, Polket
Computation/AIDeepBrain Chain 🟡, AI Infrastructure on Blockchain
Enable specific use-casesRobonomics 🟡, UniversalDOT ⚪, Evercity Sustainable Finance Protocol ⚪, Fennel Protocol 🟡, logion 🟢
NFTternoa 🟢, FRAME Pallet: NFTs for Substrate ⚪, Unique NFT Parachain 🟡, DNFT ⚪, RMRK-Substrate 🟡, NT-NFTs ⚪, Green Lemon ⚪, Basilisk 🟡
RandomnessDKG and Randomness Beacon 🟢, drand-substrate-client
LicensingAnagolay Network
Banking IntegrationFIAT on-off-ramp
CrowdfundingImbue Network 🟢, Quadratic Funding pallet by Dora ⚪, Quadratic Funding pallet by OAK 🟡Minimum Anti-Collusion Infrastructure (MACI)
Collection of PalletsSubstrate Open Runtime Module Library 🟢, warehouse ⚪, InvArch FRAME Pallet Library 🟢
MarketplacesDot Marketplace ⚪, Gated Marketplace ⚪, Ventur
Carbon CreditsBitGreen ⚪, Carbon Assets Pallet ⚪, Sequester Pallets
UTXOTuxedo
OtherMoonkit 🟢, Substrate Account Filter ⚪, Subtensor 🟢, AdMeta ⚪, Chocolate Node ⚪, Virto Network 🟢, Substrate Validator Set 🟢, DEIP ⚪, DeBio 🟢, MathChain ⚪, encointer 🟢, Grassland ⚪, Substrate-Tutorials ⚪, Fair Squares 🟢, Totem Live Accounting ⚪, Escrow Pallet ⚪, TREX ⚪, Relation Graph ⚪, Decentralized Invoice ⚪, Redstone Network 🟢, Access Control Pallet ⚪, Omniverse DLT 🟡, ISMP 🟢, XCMP, CORD Chain 🟢Decentralized review/reputation system

Host

ComponentsExisting projectsPotentially interesting projects
RustSubstrate 🟢, Cumulus 🟢
C++Kagome 🟢, Mayon
GoGossamer 🟢
JavaFruzhin 🟢, Java Host Research
AssemblyScript
Light Clientsmoldot 🟢, Substrate Connect 🟢, C++ Polkadot Light Client
TestingPolkadot Conformance 🟢, Polkafuzz

Network Maintenance Tools

ComponentsExisting projectsPotentially interesting projects
Secure validator setupPolkadot Validation Node Ansible Setup ⚪, W3F Polkadot Validator Setup ⚪, polkadot-ansible
High availability setupArchipel ⚪, Polkadot Failover Mechanism ⚪, Datagen 🟢, High Availability Validator Setup
Load Balanced Endpointsterragrunt-polkadot ⚪, Geometry Labs' Substrate Meta repo
Deployment ToolsPolkadot Package Manager ⚪, PolkaHub ⚪, Avado ⚪, Polkadot Deployer ⚪, Unified Collator Deployment
Validator monitoringONE-T 🟡, SubVT 🟢, P.A.N.I.C. ⚪, Polkalert ⚪, B-Harvest ⚪, nmonpolkadot ⚪, Polkadot-K8s-Monitor ⚪, Polkadot-Watcher ⚪, 1KV Telegram Bot
Validator payout managementSubstrate validator auto payout ⚪, Polkadot Payouts ⚪, staking-payouts CLI 🟡, Payctl ⚪, crunch 🟢
Staking MinerStaking Miner v2 🟢
Nominator ToolsValidator Selection ⚪, Polkanalyzer 🟢, Polkanalyzer-app 🟡

Signatures

ComponentsExisting projectsPotentially interesting projects
SR25519rust 🟢(contains partial bindings for C, JavaScript, and Python), .Net bindings ⚪, C(old), C(new), C/C++ 🟡, C# ⚪, Go ⚪, java ⚪, PHP
Signature Aggregationapk-proofs
Distributed key generation (DKG) or managementkeygen.rs ⚪, Secure Wallet Origin Distribution (SWORD)
Validator HSMsZondax Remote Signer

Consensus

ComponentsExisting projectsPotentially interesting projects
PoCSpartan
PoWPoW consensus for Substrate 🟢, RandomX ⚪, Sha3 PoW
Block productionBABE 🟢, Aura 🟢
FinalityGRANDPA 🟢, AlephBFT 🟢
OtherNimbus: Upgradeable consensus framework 🟡

Networking

ComponentsExisting projectsPotentially interesting projects
SCALE CodecRust 🟢, TypeScript 🟡, Python 🟡, Golang Chainsafe 🟢, Golang Itering 🟢, C ⚪, C++ ⚪, JavaScript 🟢, AssemblyScript ⚪, Haskell ⚪, Java ⚪, Ruby ⚪, Dart ⚪, Swift 🟢, scale-codec-swift ⚪, scale-codec-kotlin ⚪, PHP ⚪, JavaScript by Soramitsu ⚪, Scale Codec Comparator 🟢, ScaleCodec.sol by Darwinia ⚪, ScaleCodec.sol by Snowfork 🟢
Networking Frameworklibp2p 🟢
DHT CrawlerGo ⚪, Kotlin
RPC Tor-like accessWhiteNoise

Primitives

ComponentsExisting projectsPotentially interesting projects
StorageMerkle Tree DB
Merkle ProofsSolidity Trie Verifier 🟢

Contributing

Pull requests, issues, or other contributions from the community are encouraged! You can not only +Provenance and many others not pictured below.

|------|--------|------------|
| DeFi | Gaming | Provenance |
|______|________|____________|
Dapps
|--------------------------/-|
| Explorers, Wallets / |
|------------------------/---|
| Tools, Apis, Languages/ |
|----------------------/-----|
| 2nd layer protocols / |
|--------------------/-------|
| Chains / other |
|------------------/--- --|
| *Polkadot* | tech |
|------------------\---------|
| P2P, Crypto, Wasm \ |
|--------------------\-------|

Layers of Polkadot Stack

In the below sections, you can find a list of different layers of the Polkadot Stack.

Maintenance Status:

  • 🟢 Actively maintained
  • 🟡 Stale (no activity on the main branch for one month)
  • ⚪ Unmaintained (no activity on the main branch for more than three months)

Wallets

ComponentsExisting projectsPotentially interesting projects
Web WalletsMultix 🟢, Polkasafe 🟢, polkadot-js/apps 🟢, Talisman Web Application 🟢, mydotwallet 🟡, Sub ID 🟢, Primis ⚪, Sakura ⚪, Web3Box ⚪, Coong Wallet 🟡, Subscan Multisig UI - React 🟡, Subscan Multisig UI ⚪, Dorafactory-Multisig ⚪, Capi Multisig App 🟡User-friendly Wallet based on the Recovery Pallet, Web wallets focused on user-onboarding (e.g. using localStorage), Enterprise Wallets
Desktop Walletsnova-spektr 🟢, Omni desktop
Browser ExtensionsTalisman-Extension 🟢, SubWallet-Extension 🟢, Enkrypt 🟢, Polkadot{.js} 🟢, Polkadot-Js-Plus-Extension ⚪, Doter ⚪, Speckle OS ⚪, Kuma Cross-chain Wallet 🟢Sign-in with your polkadot, kusama, etc. account.
Mobile WalletsAirGap 🟢, SubWallet-Mobile 🟢, Lunie ⚪, Polkawallet ⚪, Parity Signer 🟢, imToken ⚪, Fearless Wallet Android 🟢, Fearless Wallet iOS 🟢, Stylo ⚪, Nova Wallet 🟢, Fractapp ⚪, Interstellar Network 🟡, Hashed Wallet
Burner Wallets/Faucet/Giftsdotdrop 🟡, KodaDot ⚪, Astar Faucet Bot 🟡, Generic sybil-resistant faucet ⚪, sybil-resistant Chat Bot Faucet 🟡Faucet (a sybil-resistant way to receive free tokens)
Wallet PluginsMetamask-Snap by Chainsafe 🟢
CLI WalletSubwallet ⚪, Proxy-hot-wallet
Hardware WalletsLedger Polkadot 🟢, Ledger Kusama 🟡, Ledger Statemint 🟡, Ledger Statemine 🟢Trezor

User Interface

ComponentsExisting projectsPotentially interesting projects
Block ExplorersCalamar 🟢, Polkaholic 🟢, Polkascan ⚪, Polkastats ⚪, Subscan 🟡, Statescan ⚪, Edgscan ⚪, Sirato 🟡, Ink! Explorer API ⚪, Substats ⚪, Hybrid Block Explorer 🟡Mempool focused explorer (including parachain transaction)
Validator DashboardsPolkadot Telemetry 🟡, Polkacube ⚪, YieldScan ⚪, Hubble ⚪, Cyclops 🟢, Web3Go 🟡
Node ExplorersPolkadot Node Explorer
NFT ExplorerNFT Explorer for Kusama & Polkadot 🟢
Governance DashboardsPolkadot Delegation Dashboard 🟢, Polkassembly ⚪, dotreasury 🟢, Bright Treasury ⚪, OpenSquare offchain voting 🟢, OpenGov Insights 🟡UI for the Kusama and/or Polkadot treasury (see bounty module), UI for Parachain Lease Offering (PLO)
StakingStaking Rewards Collector ⚪, Staking Rewards Viewer ⚪, Polkadot Staking Site ⚪, Polkadot Staking Dashboard 🟢, Polkadot/Kusama Validator Selector ⚪, Staking Income CSV Generator
Bridge UIParity Bridges UI ⚪, Donut Interface (Steem - Dot)
Parachain/CrowdloanParachains.Network ⚪, PolkAuction ⚪, Crowdloan Front End Template ⚪, Slothunter 🟢
IdenticonPolkadotWebIdenticon ⚪, Polkadot Angular IdentIcon ⚪, Bird Identicon
OtherKappaSigmaMu Fratority 🟡, Quadratic Funding Webapp ⚪, Polkawatch, Bytepay ⚪, charging-management-platform ⚪, subidentity-webapp ⚪, OpenSquare Paid QA 🟡, DotPulse ⚪, Rubeus Keeper ⚪, Polkaflow ⚪, ChainVizPortfolio Viewer like Zapper or Zerion

Tools, APIs, and Languages

ComponentsExisting projectsPotentially interesting projects
Runtime/Parachain frameworksPolkadot Blockchain SDK 🟢, Gosemble 🟡, Subsembly ⚪, Parachain utilities ⚪, GantreeTools to create parachains from frameworks used in other ecosystems
Client LibrariesCapi - Typescript 🟡, sub-api 🟢, Go 🟡, .Net ⚪, .NET Standard 2.0 🟢, Substrate .NET Toolchain 🟢, C++ ⚪, C ⚪, Haskell ⚪, Javascript 🟢, Substrate API Sidecar - TypeScript 🟢, Python 🟢, Java (+ Android) ⚪, Substrate Client Java ⚪, Rust SCS 🟢, Rust Parity (subxt) 🟢, Rust pdotc PHP (gmajor-encrypt) ⚪, PHP (neha0921) ⚪, RPC-Ethereum 🟢, Swift 🟢, Kotlin ⚪, substrate-client-kotlin ⚪, substrate-client-swift ⚪, Dart 🟡, Substrate Core Polywrapper 🟡
RPC GatewaySubway 🟢
Substrate Contract clientsPatractGo
Easy Runtime DevelopmentSubalfred 🟢, substrate-stencil ⚪, Play Substrate ⚪, substrate-node-template 🟢, Substrate Playground ⚪, AssemblyScript Runtime Generation ⚪, Substrate Package Manager ⚪, Subsembly: Framework for developing AssemblyScript Substrate Runtimes ⚪, dependency diener 🟡
Easy Smart Contract DevelopmentSwanky-cli 🟡, Typechain Polkadot 🟡, ink-playground 🟡, DRink! 🟢, Ink! Remix Plugin ⚪, Signac ⚪, INK!athon 🟢, ink!-boxes ⚪, ink!-smart-contract-wizard ⚪, Polkadot Contract Wizard 🟢, ink-wrapper 🟡, ink! Analyzer for VS Code 🟢
IDE PluginsInk! Analyzer 🟢, Substrate Marketplace VS Code Plugin ⚪, VS Code Plugin ⚪, Atom Code Plugin ⚪, zombienet extension
Runtime/Pallet SecuritySubstrate Runtime Fuzzer 🟡, Substrate Toml Lint ⚪, K specifications 🟢, PolPatrol - Polkadot Runtime CheckerAutomated Runtime checking tools, economic audit simulator such as gauntlet.network
Smart Contract LanguagesAsk! 🟢, Subscript ⚪, Solang 🟢, Ink! 🟢, pallet-move 🟡, Move VM Substrate ⚪, Move smart contract by Neatcoin ⚪, Sol2Ink ⚪, eBPF Contracts Hackathon ⚪, PolkaVM 🟢Functional Programming Languages, other languages with developed toolchains
Smart Contract SecurityPatron 🟢
TestingPolkadot introspector 🟢, Subshell 🟢, substrate-simnode 🟢, Halva ⚪, Ink Waterfall 🟡, Redspot ⚪, MixBytes Tank ⚪, sub-flood ⚪, Substrate debug-kit ⚪, Dotscale - SCALE Codec Comparator ⚪, Asset CLI tool ⚪, sub_crash ⚪, subwasm 🟢, subsee ⚪, polkadot-lab ⚪, RPC-perf
Static AnalysisSubstrace ⚪, Static analyzer for Substrate FRAME's pallets ⚪, CoinFabrik Scout 🟢
TestnetZombienet 🟢, Chopsticks 🟢, Polkadot Launch ⚪, polkadot-starship ⚪, Fork off Substrate ⚪, try-runtime-cli 🟢, Parachain Launch 🟢, Larch Zombienet GUI 🟢
BenchmarkingBenchmarking CLI 🟢, Polkadot sTPS 🟢, Clockchain ⚪, Substrate Graph Benchmarks ⚪, ink! & pallet benchmarking template ⚪, smart-bench 🟡
Blockchain Indexing EngineSquid SDK 🟢, Hybrid Indexer 🟢, Substrate Archive ⚪, PSQL Indexer ⚪, Substrate Graph ⚪, Subquery 🟢, MBELT3 🟡, stick 🟢, Hyperdot 🟢
Blockchain/Event MonitoringWeb3 Guardian ⚪, Aurras Event Manager 🟢, @commonwealth/chain-events ⚪, Massbit ⚪, Polkadot Basic Notifications ⚪, Ocelloids 🟡, Tracking Chain 🟢,
GamingCrossbowAmethyst + Substrate
No-code PlatformsEzCode's Polkadot.js plugin on Bubble.io ⚪, Blackprint Visual Programming Polkadot.js module 🟡, SubRelay 🟡
WalletsTalisman Connect ⚪, SubWallet-SubConnect 🟢, Metadata Portal 🟢, Tesseract 🟡, WalletConnect ⚪, BitGoJS 🟢
XCMTrappist 🟢, XCM-tools 🟡, XCM-tools Golang 🟢,ParaSpell 🟡, XBI 🟡, XCM TS/JS SDK
Otherasset-transfer-api 🟢, txwrapper-core 🟢, open-web3 JS library ⚪, VM-Bridge ⚪, srtool 🟢, srtool-cli 🟢, Substrate Tip Bot 🟢, ORI (Onchain Risk Intelligence) ⚪, PolkaTools ⚪, polkadot-scripts ⚪, Sube ⚪, data-store-sidecar ⚪, SugarFunge 🟡, substrate-wasmedge ⚪, EightFish 🟡, Sandox 🟢

ink Smart Contracts

ComponentsExisting projectsPotentially interesting projects
BridgesDante Protocol
DeFiPendulum-Ink-Wrapper 🟡, Panorama Swap 🟡, ink_bank ⚪, Polkadot AMM ⚪, Vera ⚪, Nsure Insurance ⚪, Everlasting Cash ⚪, Coinversation ⚪, zenlink-dex-contract ⚪, AlgoCashNew seigniorage-style stable coins
GamingOpen Emoji Battler 🟡, NewOmega
DAOSyncraDAO ⚪, subDAO ⚪, RainbowDAO ⚪, MangoBox ⚪, MangoSale 🟢
Identity/DIDDotflow 🟢
OracleDIA WASM Oracle
Spam ProtectionProsopo
ToolingOpenBrush
GovernanceAbax Governance 🟢
NFTArtZero
Othermagink 🟡, ink-test-contracts 🟡, Candle Auctions ⚪, polkasign-contract ⚪, OCEX 🟡, Roloi ⚪, OpenPayroll 🟡, BlockchainFoodOrder 🟢

Chains and Pallets

ComponentsExisting projectsPotentially interesting projects
Scalable TransactionsPerun channels ⚪, CLI demo of Perun ⚪, Astar 🟢, Celer ⚪, Gunclear ⚪, TPScore 🟢roll-ups, DAG-based consensus mechanisms, side chains
BridgesinterBTC 🟢, DKG Substrate 🟢, Sygma 🟢, EOS by Bifrost ⚪, POA - Substrate ⚪, Substrate - Ethereum DAI Bridge ⚪, Substrate - Substrate Bridge ⚪, BTC by ChainX 🟡, Cosmos-Substrate bridge ⚪, Substrate IBC Pallet ⚪, Polkadot Ethereum Bridge 🟢, Darwinia 🟢, Spacewalk: a Stellar bridge 🟢, Filecoindot ⚪, Axelar-SubstrateZCash
PrivacyZeroChain ⚪, xx network ⚪, pLibra (Phala Network) 🟢, Automata Network ⚪, Zero Network 🟢, Silent DataMulti-Asset Shielded Pool (MASP) , Zkay, Zexe
ZKPZeroPool ⚪, Megaclite ⚪, zkMega ⚪, PLONK for Substrate ⚪, Webb Anchor Protocol 🟡, zk-SNARKs tutorial ⚪, substrate-zk 🟢
TEEAcurast 🟢, Integritee 🟢, substraTEEKeysafe Protocol
DeFiPrivaDEX ⚪, Fusotao 🟢, Reef ⚪, Diora ⚪, Pendulum Chain 🟢, Compound Gateway ⚪, Parallel Finance 🟡, PINT ⚪, Laminar Chain ⚪, Acala 🟢, Centrifuge 🟢, Stafi 🟡, Definex ⚪, OAX Foundation ⚪, Cybex ⚪, Zenlink ⚪, Swaps Pallet ⚪, Polkadex 🟡, SubDEX ⚪, HydraDX 🟢, Substrate Stablecoin ⚪, Standard protocol ⚪, Polkaswap 🟢, Curve AMM ⚪, Konomi Network ⚪, Stable Asset 🟡, Libra Payment ⚪, Mangata 🟢, Tidechain 🟢, Basilisk 🟡, Polymesh 🟢DEX with privacy and confidentiality features such as those found in a dark pool
Smart contract chainsmoonbeam 🟢, Aleph-node 🟢, Edgeware ⚪, ParaState ⚪, gear 🟢, CENNZnet ⚪, SkyeKiwi ⚪, OAK-blockchain 🟢, ICE Blockchain ⚪, Polkadot Smart Chain ⚪, Madara - Cairo/Starknet 🟢smart contract chains with novel security approaches, smart contract chains based on existing toolchains
OracleLaminar 🟢, Chainlink-polkadot ⚪, Ares Protocol ⚪, Kylin Network ⚪, interbtc-clients oracle 🟢, Anonima ⚪, SaaS3 ⚪, Tellor 🟡, Bridgestate Oracle 🟢
Identity/DIDParami ⚪, Litentry 🟢, pallet-did ⚪, dot-id
IoTNodle 🟢, MXC/DataHighway ⚪, peaq-network-node
Verifiable ClaimsKILT 🟢, Dock 🟢, Fennel Protocol 🟡
Supply chainDSCP Node 🟢
Health care
Music IndustryAllfeat Network 🟢
Data AvailabilityAvail 🟢, Melodot 🟢
Social NetworkingFrequency 🟢, Social Network ⚪, SubSocial 🟢, ZeroDAO ⚪, Myriad Node 🟢, Wika Network ⚪, Project Liberty 🟢, Listen ⚪, Tribal Protocol ⚪, Five Degrees on Substrate ⚪, Acuity SocialPrivate instant messenger that uses on-chain identity
Governance/DAOHashed Network ⚪, Sunshine DAO ⚪, Governance OS ⚪, Idavoll Network ⚪, Substrate Moloch ⚪, QRUCIAL-DAO 🟡, Societal 🟢, DAOs ⚪, Shivarthu 🟢, Faterium 🟢, Supersig ⚪, GenesisDAO 🟢, DAO Entrance 🟡, Liberland 🟡Consul - Open Government and E-Participation Web Software
Prediction Markets and FutarchyZeitgeist 🟢, X Predict Market
MessagingHOPR ⚪, Nolik ⚪, Uke ⚪, Diffy Chat 🟡
File Storage, CloudSubsocial-Offchain 🟢, DatDot ⚪, Crust Network 🟢, offchain::ipfs ⚪, Canyon Network 🟡, CESS 🟢, CESS Proving Subsystem ⚪, Iris ⚪, fmd-cess ⚪, IPFS Frame V3 ⚪, Threefold Chain 🟢, Apron ⚪, IPFS Utilities
Name ServiceSubstrate Names ⚪, ENS on Substrate ⚪, PNS-Pallets ⚪, Faceless ⚪, Anchor 🟢
GamingBit.country 🟡, SubGame ⚪, subzero ⚪, Web3Games 🟡, Ajuna Network 🟢, Gafi Network ⚪, Asylum 🟢, 3DPass 🟢, Polket
Computation/AIDeepBrain Chain ⚪, AI Infrastructure on Blockchain
Enable specific use-casesRobonomics 🟡, UniversalDOT ⚪, Evercity Sustainable Finance Protocol ⚪, Fennel Protocol 🟡, logion 🟢
NFTternoa 🟢, FRAME Pallet: NFTs for Substrate ⚪, Unique NFT Parachain ⚪, DNFT ⚪, RMRK-Substrate ⚪, NT-NFTs ⚪, Green Lemon ⚪, Basilisk 🟡
RandomnessDKG and Randomness Beacon 🟢, drand-substrate-client
LicensingAnagolay Network
Banking IntegrationFIAT on-off-ramp
CrowdfundingImbue Network 🟢, Quadratic Funding pallet by Dora ⚪, Quadratic Funding pallet by OAK 🟡Minimum Anti-Collusion Infrastructure (MACI)
Collection of PalletsSubstrate Open Runtime Module Library 🟢, warehouse ⚪, InvArch FRAME Pallet Library 🟡
MarketplacesDot Marketplace ⚪, Gated Marketplace ⚪, Ventur
Carbon CreditsBitGreen ⚪, Carbon Assets Pallet ⚪, Sequester Pallets
UTXOTuxedo
OtherMoonkit 🟢, Substrate Account Filter ⚪, Subtensor 🟢, AdMeta ⚪, Chocolate Node ⚪, Virto Network 🟢, Substrate Validator Set 🟡, DEIP ⚪, DeBio 🟢, MathChain ⚪, encointer 🟢, Grassland ⚪, Substrate-Tutorials ⚪, Fair Squares 🟢, Totem Live Accounting ⚪, Escrow Pallet ⚪, TREX ⚪, Relation Graph ⚪, Decentralized Invoice ⚪, Redstone Network 🟢, Access Control Pallet ⚪, Omniverse DLT 🟡, ISMP 🟢, XCMP 🟢, CORD Chain 🟢Decentralized review/reputation system

Host

ComponentsExisting projectsPotentially interesting projects
RustSubstrate 🟢, Cumulus 🟢
C++Kagome 🟢, Mayon
GoGossamer 🟢
JavaFruzhin 🟢, Java Host Research
AssemblyScript
Light Clientsmoldot 🟢, Substrate Connect 🟢, C++ Polkadot Light Client
TestingPolkadot Conformance 🟢, Polkafuzz

Network Maintenance Tools

ComponentsExisting projectsPotentially interesting projects
Secure validator setupPolkadot Validation Node Ansible Setup ⚪, W3F Polkadot Validator Setup ⚪, polkadot-ansible 🟢
High availability setupArchipel ⚪, Polkadot Failover Mechanism ⚪, Datagen 🟢, High Availability Validator Setup
Load Balanced Endpointsterragrunt-polkadot ⚪, Geometry Labs' Substrate Meta repo
Deployment ToolsPolkadot Package Manager ⚪, PolkaHub ⚪, Avado ⚪, Polkadot Deployer ⚪, Unified Collator Deployment
Validator monitoringONE-T ⚪, SubVT 🟢, P.A.N.I.C. ⚪, Polkalert ⚪, B-Harvest ⚪, nmonpolkadot ⚪, Polkadot-K8s-Monitor ⚪, Polkadot-Watcher ⚪, 1KV Telegram Bot
Validator payout managementSubstrate validator auto payout ⚪, Polkadot Payouts ⚪, staking-payouts CLI 🟡, Payctl ⚪, crunch 🟢
Staking MinerStaking Miner v2 🟢
Nominator ToolsValidator Selection ⚪, Polkanalyzer 🟢, Polkanalyzer-app 🟢

Signatures

ComponentsExisting projectsPotentially interesting projects
SR25519rust 🟢(contains partial bindings for C, JavaScript, and Python), .Net bindings ⚪, C(old), C(new), C/C++ ⚪, C# ⚪, Go ⚪, java ⚪, PHP
Signature Aggregationapk-proofs
Distributed key generation (DKG) or managementkeygen.rs ⚪, Secure Wallet Origin Distribution (SWORD)
Validator HSMsZondax Remote Signer

Consensus

ComponentsExisting projectsPotentially interesting projects
PoCSpartan
PoWPoW consensus for Substrate 🟢, RandomX ⚪, Sha3 PoW
Block productionBABE 🟢, Aura 🟢
FinalityGRANDPA 🟢, AlephBFT 🟢
OtherNimbus: Upgradeable consensus framework 🟡

Networking

ComponentsExisting projectsPotentially interesting projects
SCALE CodecRust 🟢, TypeScript 🟡, Python 🟢, Golang Chainsafe 🟢, Golang Itering 🟢, C ⚪, C++ ⚪, JavaScript 🟢, AssemblyScript ⚪, Haskell ⚪, Java ⚪, Ruby ⚪, Dart ⚪, Swift 🟡, scale-codec-swift ⚪, scale-codec-kotlin ⚪, PHP ⚪, JavaScript by Soramitsu ⚪, Scale Codec Comparator 🟢, ScaleCodec.sol by Darwinia ⚪, ScaleCodec.sol by Snowfork 🟢
Networking Frameworklibp2p 🟢
DHT CrawlerGo ⚪, Kotlin
RPC Tor-like accessWhiteNoise

Primitives

ComponentsExisting projectsPotentially interesting projects
StorageMerkle Tree DB
Merkle ProofsSolidity Trie Verifier 🟡

Contributing

Pull requests, issues, or other contributions from the community are encouraged! You can not only add specific projects, but also potentially interesting fields/areas which are currently missing in the tech stack.

❗ All technologies listed above need to be open-source. Ideally, the links lead directly to the code.

Note: You will need a GitHub account to suggest changes or open issues. If you do not have one, you -may sign up for free.

- +may sign up for free.

+ \ No newline at end of file diff --git a/docs/build-oracle.html b/docs/build-oracle.html index 2ef9b4bafe20..637766589bf1 100644 --- a/docs/build-oracle.html +++ b/docs/build-oracle.html @@ -19,7 +19,7 @@ - + @@ -49,7 +49,7 @@ ecosystem develops and oracle parachains begin to appear, this article will be updated with a comparison of the different solutions and the benefits and drawbacks that each provide.

- + \ No newline at end of file diff --git a/docs/build-pdk.html b/docs/build-pdk.html index 609f16a193de..39a91c8fa795 100644 --- a/docs/build-pdk.html +++ b/docs/build-pdk.html @@ -19,7 +19,7 @@ - + @@ -188,7 +188,7 @@ transition into a Relay Chain.

For more information on how parathread per-block auctions work, see the more detailed parathread page.

Resources

- + \ No newline at end of file diff --git a/docs/build-protocol-info.html b/docs/build-protocol-info.html index e4586aa3a631..9ff751ae6a7e 100644 --- a/docs/build-protocol-info.html +++ b/docs/build-protocol-info.html @@ -19,7 +19,7 @@ - + @@ -173,7 +173,7 @@ to cancel a runtime upgrade. Using a finalized depth of ten blocks should be safe.

Note that block production and finality are isolated processes in Polkadot, and the chain can have a long unfinalized head.

Do users need to interact with any smart contracts?

No, users interact directly with the chain's logic.

Does Polkadot have state rent?

No, Polkadot uses the existential deposit to prevent dust accounts and other economic mechanisms like locking or reserving tokens for operations that utilize state.

What is an external source to see the current chain height?

- + \ No newline at end of file diff --git a/docs/build-smart-contracts.html b/docs/build-smart-contracts.html index 4f38f97393ce..9df6071317b8 100644 --- a/docs/build-smart-contracts.html +++ b/docs/build-smart-contracts.html @@ -19,7 +19,7 @@ - + @@ -143,7 +143,7 @@ Substrate and Polkadot StackExchange to ask their questions. As always, keep up to date with Polkadot and Kusama by following the social channels.

- + \ No newline at end of file diff --git a/docs/build-ss58-registry.html b/docs/build-ss58-registry.html index 87cfbda4bdb8..9824f82a5503 100644 --- a/docs/build-ss58-registry.html +++ b/docs/build-ss58-registry.html @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/docs/build-storage.html b/docs/build-storage.html index a3b21f5c1f01..4be9ff0bfe63 100644 --- a/docs/build-storage.html +++ b/docs/build-storage.html @@ -19,7 +19,7 @@ - + @@ -59,7 +59,7 @@ directory info will not be visible if you switch to a new browser or clear the browser cache. The storage module allows you to export file directory info from the current browser and import it to the new browser.

manage file dir

note

These above images are taken from this pull request

- + \ No newline at end of file diff --git a/docs/build-substrate.html b/docs/build-substrate.html index 5e0d19bd6488..416aeb100d2c 100644 --- a/docs/build-substrate.html +++ b/docs/build-substrate.html @@ -19,7 +19,7 @@ - + @@ -54,7 +54,7 @@ end-users to interact with applications connected to multiple blockchains or connect their own blockchains to applications that support it.

note

Substrate Connect will auto-detect whether a user is using the extension. If not, the Wasm light client will be created in-page for them.

Resources

- + \ No newline at end of file diff --git a/docs/build-tools-index.html b/docs/build-tools-index.html index 965924143df5..7608857d944f 100644 --- a/docs/build-tools-index.html +++ b/docs/build-tools-index.html @@ -19,7 +19,7 @@ - + @@ -104,7 +104,7 @@ Squid Archive Registry
  • Polka-store - A tool which scans a Substrate chain and stores balance-relevant transactions in an SQLite database.
  • Substrate-graph - A compact indexer for Substrate based nodes providing a GraphQL interface.
  • - + \ No newline at end of file diff --git a/docs/build-transaction-construction.html b/docs/build-transaction-construction.html index b2b73b8b8e33..3e444ea8fedd 100644 --- a/docs/build-transaction-construction.html +++ b/docs/build-transaction-construction.html @@ -19,7 +19,7 @@ - + @@ -59,7 +59,7 @@ author_submitAndWatchExtrinsic, the latter of which will subscribe you to events to be notified as a transaction gets validated and included in the chain.

    Notes

    Some addresses to use in the examples. See Subkey documentation.

    $ subkey --network polkadot generate
    Secret phrase `pulp gaze fuel ... mercy inherit equal` is account:
    Secret seed: 0x57450b3e09ba4598 ... ... ... ... ... ... ... .. 219756eeba80bb16
    Public key (hex): 0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235
    Account ID: 0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235
    SS58 Address: 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2

    $ subkey --network polkadot generate
    Secret phrase `exercise auction soft ... obey control easily` is account:
    Secret seed: 0x5f4bbb9fbb69261a ... ... ... ... ... ... ... .. 4691ed7d1130fbbd
    Public key (hex): 0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243
    Account ID: 0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243
    SS58 Address: 15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y
    - + \ No newline at end of file diff --git a/docs/builders-program.html b/docs/builders-program.html index 5ba0de3324ff..22b6aacfa3ad 100644 --- a/docs/builders-program.html +++ b/docs/builders-program.html @@ -19,7 +19,7 @@ - + @@ -46,7 +46,7 @@ form of tooling, UI, middleware, bridges, and more.

    Application track

    This track supports builders who are building on top of Substrate-based chains.

    Check out the official Substrate Builders Program site for more information and steps on how to apply.

    - + \ No newline at end of file diff --git a/docs/community-index.html b/docs/community-index.html index c4cd7937df4f..feb6cd0dfe41 100644 --- a/docs/community-index.html +++ b/docs/community-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/community.html b/docs/community.html index 309a0f161a08..eb46bad06bf5 100644 --- a/docs/community.html +++ b/docs/community.html @@ -19,7 +19,7 @@ - + @@ -59,7 +59,7 @@ development and where there's room for your contributions.
  • Teams Building on Polkadot - Community maintained list of teams building on Polkadot and/or Substrate. (Note that this may contain inaccuracies, as it's unofficial).
  • - + \ No newline at end of file diff --git a/docs/contributing.html b/docs/contributing.html index aa8d9d3d3961..10d731e0d767 100644 --- a/docs/contributing.html +++ b/docs/contributing.html @@ -19,7 +19,7 @@ - + @@ -58,7 +58,7 @@ the official crowdin knowledge base as well.




    The following shows an example in Arabic. You can type in your desired translation for each section in the provided area, while using the suggestions generated by the crowdin built-in translator.


    Make sure to save your translation.

    - + \ No newline at end of file diff --git a/docs/contributors.html b/docs/contributors.html index 46f492984d9a..7f6280855694 100644 --- a/docs/contributors.html +++ b/docs/contributors.html @@ -19,7 +19,7 @@ - + @@ -95,7 +95,7 @@ for the Polkadot protocol. He contributed in creating written content and example applications that demonstrate how to use these new technologies.

    You can now find Logan leading efforts to define the prediction market space at Zeitgeist.

    - + \ No newline at end of file diff --git a/docs/dashboards-index.html b/docs/dashboards-index.html index 1bcf3a054e7a..645fa3cfbb58 100644 --- a/docs/dashboards-index.html +++ b/docs/dashboards-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/dev-heroes.html b/docs/dev-heroes.html index 1b7dc75696a9..7ad97875c12e 100644 --- a/docs/dev-heroes.html +++ b/docs/dev-heroes.html @@ -19,7 +19,7 @@ - + @@ -40,7 +40,7 @@ open source technology stack list and contribute with a pull request, an issue, or find and fix bugs.

  • Create content: Write a blog post, record a video tutorial, and write a Twitter thread. Share about your latest coding success, something you learned and are excited about.

  • Speak at events: Do a workshop or talk at meetups and conferences.

  • - + \ No newline at end of file diff --git a/docs/faq.html b/docs/faq.html index 961e77a33783..298f57d3b555 100644 --- a/docs/faq.html +++ b/docs/faq.html @@ -19,7 +19,7 @@ - + @@ -189,7 +189,7 @@ fee calculation page in the Substrate documentation for more detailed information.

    Answered by Gav series

    The "Answered by Gav" series is a collection of posts uploaded to Reddit of questions that have been asked in the Polkadot Watercooler Riot channel and answered by Polkadot founder Gavin Wood.

    - + \ No newline at end of file diff --git a/docs/general-index.html b/docs/general-index.html index e4ad48b8b7cd..db7ae8c2831c 100644 --- a/docs/general-index.html +++ b/docs/general-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/getting-started.html b/docs/getting-started.html index 0b95c625c137..c8bda9fc11d3 100644 --- a/docs/getting-started.html +++ b/docs/getting-started.html @@ -19,7 +19,7 @@ - + @@ -133,7 +133,7 @@ about Polkadot.
  • Sample Applications - Sample applications that are built on or currently being built for Polkadot.
  • Contributing Guide - Rules for contributing to the wiki.
  • Polkadot Knowledge Base - Troubleshooting resources for specific errors and problems.
  • - + \ No newline at end of file diff --git a/docs/glossary.html b/docs/glossary.html index 5e002a9011fe..6db5560145ef 100644 --- a/docs/glossary.html +++ b/docs/glossary.html @@ -19,7 +19,7 @@ - + @@ -28,8 +28,8 @@ this era. The nominator is placing their stake behind this validator for this era and will potentially receive staking rewards in return for doing so.

    Alexander

    The fourth (now defunct) proof of concept (PoC-4) testnet for Polkadot.

    Asset Hub

    A system parachain used for asset management.

    Attestation

    In the Polkadot validity system, an attestation is a type of message that validators broadcast that says whether they think a -parachain candidate block is valid or invalid.

    Auction (Parachain)

    Parachain auctions are how non-common-good parathreads win a slot to become a parachain.

    Aura

    Authority-based round-robin scheduling (AURA) provides a slot-based block authoring mechanism, -where a known set of authorities take turns producing blocks.

    Authority

    An authority is a generic term for the role in a blockchain that can participate in the consensus +parachain candidate block is valid or invalid.

    Auction (Parachain)

    Parachain auctions are how non-common-good parathreads win a slot to become a parachain.

    Aura

    Authority-based round-robin scheduling (AURA) provides a slot-based block authoring mechanism, where +a known set of authorities take turns producing blocks.

    Authority

    An authority is a generic term for the role in a blockchain that can participate in the consensus mechanisms. In GRANDPA, the authorities vote on chains they consider final. In BABE, the authorities are block producers. Authority sets can be chosen to be mechanisms such as Polkadot's NPoS algorithm.

    Availability Cores

    Slots used to process parachains. The runtime assigns each parachain to an availability core and @@ -285,8 +285,8 @@ execution. Checkout this section of the Substrate docs covering transaction weights and fees.

    Witness

    Cryptographic proof statements of data validity.

    Whitelist Pallet

    Allows one Origin to escalate the privilege level of another Origin for a certain operation. In terms of OpenGov, it allows the Fellowship to authorise a new origin -(which we will call Whitelisted-Root) to be executed with Root-level privileges.

    - +(which we will call Whitelisted-Root) to be executed with Root-level privileges.

    + \ No newline at end of file diff --git a/docs/grants.html b/docs/grants.html index fd88d84897ab..a3e44fdd280c 100644 --- a/docs/grants.html +++ b/docs/grants.html @@ -19,7 +19,7 @@ - + @@ -39,7 +39,7 @@ Foundation has considered new ways to distribute KSM for people who need KSM to build.

    If you are interested in obtaining KSM for building or research, you can apply through the Treasury or receive a tip for doing something cool in the community.

    Other Grant Programs

    Below is a list of other grant programs in the Polkadot/Substrate ecosystem.

    - + \ No newline at end of file diff --git a/docs/how-to-dyor.html b/docs/how-to-dyor.html index e38d4776b44c..bebafc5a2997 100644 --- a/docs/how-to-dyor.html +++ b/docs/how-to-dyor.html @@ -19,7 +19,7 @@ - + @@ -222,7 +222,7 @@ aims to bring to the ecosystem.

    This does not fall under fact-checking and verifying claims, but it is important to mention: fully understanding what something does and its prospective impact is an integral part of making an informed decision, so do not overlook it.

    - + \ No newline at end of file diff --git a/docs/kusama-adversarial-cheatsheet.html b/docs/kusama-adversarial-cheatsheet.html index da880840925e..4def406d5ec2 100644 --- a/docs/kusama-adversarial-cheatsheet.html +++ b/docs/kusama-adversarial-cheatsheet.html @@ -19,14 +19,14 @@ - +

    Adversarial Cheatsheet

    Expect things to break on Kusama. To help you break some things, take a look at the following threat model.

    Hacker wants to …Security promise that should prevent the hackHacking IncentiveHacking DamageHacking value details
    Double spend tokens via getting the clients to accept a different chainIntegrity (System-wide)HighHighIf attackers are able to double spend tokens, they are able to get services without paying for them. This gives them a high monetary incentive to execute the attack.
    Cause system to mint tokens to his own accountIntegrity (System-wide) MediumLow - MediumIf an attacker is able to craft transactions that mint tokens to their account, then this provides a high monetary incentive to execute this attack.
    Validate malicious blocks to double spend tokensAvailability (System-wide) HighMediumIf an attacker is able to double spend tokens, they are able to get services without paying for them. This gives them a high monetary incentive to execute the attack.
    Undermine consensus mechanism to split chainIntegrity (System-wide)HighHigh"If an attacker is able to double spend tokens, they are able to get services without paying for them. This gives them a high monetary incentive to execute the attack. Betting on decrease in value of the cryptocurrency or competitors want to damage the reputation, so that the value of their blockchain increases.
    Tamper/manipulate blockchain history to invalidate transactions (e.g. a voting result)Integrity (System-wide)MediumMedium - HighAttacker can rollback undesired transactions by intentionally invalidating the block where transaction has happened. Attacker can force a governance decision (or even an on-chain update) that favors them.
    Undermine blockchain or consensus mechanism to damage the ecosystem's reputationAvailability (System-wide)HighHighBetting on decrease in value of the cryptocurrency or competitors want to damage the reputation, so that the value of their blockchain increases
    CensorshipAvailability (System-wide)MediumHighHackers are able to block undesirable types of transactions (e.g. industry competitor transactions or referendum votes). This could be achieved by colluding with other stakeholders or by otherwise obtaining more voting power.
    Deanonymize usersConfidentiality (Node)MediumMediumParties that want to de-anonymize users can use the information to oppress the opposition (e.g. political activists).
    Steal token from nodeIntegrity (Node)HighHighAttackers that are able to steal tokens from nodes can claim assets for themselves, which gives them a high monetary incentive to execute the attack.
    Steal token from node by leaking credentialsConfidentiality (Node)HighHighAttackers that are able to steal tokens from nodes can claim assets for themselves, which gives them a high monetary incentive to execute the attack.
    Prevent node from accessing the Polkadot networkAvailability (Node)LowLow - MediumRun a targeted denial-of-service attack out of revenge, monetary interests (in case of a competing coin exchange, etc.).
    Defraud other participantsIntegrity (Node)MediumLow - MediumAttacker can abuse other participants’ misunderstanding of Polkadot's security guarantees to defraud them. Also, if the reward for calling out bad behavior can be set up so that it is higher than the according punishment, a set of self-handled nodes can be set up to generate a source cycle. Other participants are not needed for this attack.
    Defraud other participantsIntegrity (System-wide)HighHighAn attacker could abuse bugs in Polkadot's economic system to defraud other participants. For example, an attacker could exploit a logic bug to not pay transaction fees.
    - + \ No newline at end of file diff --git a/docs/kusama-bug-bounty.html b/docs/kusama-bug-bounty.html index cc5688fa88d8..fdb33db09757 100644 --- a/docs/kusama-bug-bounty.html +++ b/docs/kusama-bug-bounty.html @@ -19,7 +19,7 @@ - + @@ -44,7 +44,7 @@ not to be disruptive or harmful to our users or us. Otherwise, your actions might be interpreted as an attack rather than an effort to be helpful.

    How to report a bug

    Please follow the instructions at web3.foundation/security-report/.

    - + \ No newline at end of file diff --git a/docs/kusama-claims.html b/docs/kusama-claims.html index 7fccb57bb5b9..3bb4570d6779 100644 --- a/docs/kusama-claims.html +++ b/docs/kusama-claims.html @@ -19,7 +19,7 @@ - + @@ -98,7 +98,7 @@ Polkadot Support page.

    Third Party Claims Processes

    We do not recommend using a third-party app or process to perform your claim or acquire KSM.

    Claiming using a third-party process can lead to the loss of your allocation; therefore, we cannot recommend using any third-party apps to do so. Manually specifying your transaction data, as specified in our claims process, is the only way to be certain you will receive your allocation.

    - + \ No newline at end of file diff --git a/docs/kusama-coc.html b/docs/kusama-coc.html index 59f18babf5eb..2eb310d9f130 100644 --- a/docs/kusama-coc.html +++ b/docs/kusama-coc.html @@ -19,7 +19,7 @@ - + @@ -42,7 +42,7 @@ on feedback from the Kusama participants and/or the Polkadot community.

    Bugs

    Please understand that this network is, despite its success, an experiment with potential flaws, so it’s appreciated that community members help report any sort of exploits directly to the team before sharing publicly. Please see the bug bounty program.

    - + \ No newline at end of file diff --git a/docs/kusama-community.html b/docs/kusama-community.html index dfc3ccbe268b..c112daff6c68 100644 --- a/docs/kusama-community.html +++ b/docs/kusama-community.html @@ -19,7 +19,7 @@ - + @@ -42,7 +42,7 @@ for technical questions on building with Substrate.
  • Smart Contracts & Parity Ink! - A room to discuss developing Substrate smart contracts using Parity Ink!
  • Social

    Blogs and tutorials

    Newsletters

    - + \ No newline at end of file diff --git a/docs/kusama-getting-started.html b/docs/kusama-getting-started.html index 9c5d2cc3f477..7efeccf8fc28 100644 --- a/docs/kusama-getting-started.html +++ b/docs/kusama-getting-started.html @@ -19,7 +19,7 @@ - + @@ -55,7 +55,7 @@ here.

    While Kusama does not support smart contracts natively, building apps on it is still possible (e.g. RMRK.app). If you're interested in diving deeper into proper development, however, check out the builders guide.

    Additional Resources:

    - + \ No newline at end of file diff --git a/docs/kusama-index.html b/docs/kusama-index.html index 6d511fd9a5a2..016339332c3f 100644 --- a/docs/kusama-index.html +++ b/docs/kusama-index.html @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@

    Kusama

    Polkadot's Canary Network

    Kusama is a canary network for Polkadot; an earlier release of the code that is available first and holds real economic value. For developers, Kusama is a proving ground for runtime upgrades, on-chain governance, and parachains.

    No Promises.

    Kusama has a dedicated Wiki guide. Click on the image below to access it.

    guide
    Kusama Guide
    - + \ No newline at end of file diff --git a/docs/kusama-parameters.html b/docs/kusama-parameters.html index c2adc25b48b8..458d0e5de0db 100644 --- a/docs/kusama-parameters.html +++ b/docs/kusama-parameters.html @@ -19,7 +19,7 @@ - + @@ -41,7 +41,7 @@ redirected into the Society's treasury to fund growth.

    Precision

    KSM have 12 decimals of precision. In other words, 1e12 (1_000_000_000_000, or one trillion) Plancks make up a single KSM.

    - + \ No newline at end of file diff --git a/docs/kusama-social-recovery.html b/docs/kusama-social-recovery.html index 6fba4e5999ab..523d5be4b888 100644 --- a/docs/kusama-social-recovery.html +++ b/docs/kusama-social-recovery.html @@ -19,7 +19,7 @@ - + @@ -66,7 +66,7 @@ either go through the council or submit a public proposal. To learn more about governance, see here.

    Further Reading

    - + \ No newline at end of file diff --git a/docs/kusama-timeline.html b/docs/kusama-timeline.html index 9478b050d7e7..7e678a8afdf8 100644 --- a/docs/kusama-timeline.html +++ b/docs/kusama-timeline.html @@ -19,7 +19,7 @@ - + @@ -57,7 +57,7 @@ forkless upgradability provided by Substrate, chaos continues, and in the spirit of chaos, more teams are eager to deploy on Kusama. The path of Kusama deployment has paved the way to Polkadot's parachains as the technology became proven.

    - + \ No newline at end of file diff --git a/docs/learn-DOT.html b/docs/learn-DOT.html index 6771cb7595f6..0d62487a7b00 100644 --- a/docs/learn-DOT.html +++ b/docs/learn-DOT.html @@ -19,7 +19,7 @@ - + @@ -81,7 +81,7 @@ through the Treasury. Alternatively, they can be obtained on the open market.

    Polkadot Mainnet DOT

    Polkadot Mainnet DOT are not freely given away. If you purchased DOT in the original 2017 offering, you may claim them via the Polkadot claims process. Alternatively, they are available on the open market.

    - + \ No newline at end of file diff --git a/docs/learn-account-advanced.html b/docs/learn-account-advanced.html index 3398acfeae0c..0262acc74f8d 100644 --- a/docs/learn-account-advanced.html +++ b/docs/learn-account-advanced.html @@ -19,7 +19,7 @@ - + @@ -95,7 +95,9 @@ are like any other account on-chain. These special system accounts are just public keys, with the private key being unknown (and unattainable). So, that means that only the pallet itself can interact with this account. These accounts can never issue a signed -extrinsic since they do not have a private key.

    Explore System Accounts

    Treasury account address - 13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB

    You can view the existing system accounts on Subscan.

    Let us take a look at how system accounts are generated under the hood. For instance, to generate +extrinsic since they do not have a private key.

    Explore System Accounts

    Treasury account address - +13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB

    You can view the existing system accounts on +Subscan.

    Let us take a look at how system accounts are generated under the hood. For instance, to generate the treasury account, the raw bytes of the strings "modl" and "py/trsry" are combined to create the AccountID. For more information, check the post on Substrate StackExchange on Treasury accounts. @@ -169,8 +171,8 @@ e.g. an account that was stored externally in the extension on the old computer but was created directly in the browser on the new one.

    This has been tested on Brave and Chrome, but not other browsers.

    1. Go to Polkadot-JS Apps
    2. Go to JavaScript console on the browser (Available in Developer Tools)
    3. Type in the command:
    JSON.stringify(localStorage)
    1. Copy and paste the returned string to a text editor and save the file.
    2. Check that the string you pasted begins and ends with a tick mark ('). If not, add one to the beginning and end.
    3. Save and send that file with the copied string to the new computer.
    4. On the new computer, go to Polkadot-JS Apps
    5. Open the Javascript console on the browser (Available in Developer Tools)
    6. Set a variable raw equal to the string from the text file
    raw = ... copy-pasted json from original computer ...
    1. Run the following code on the console:
    accounts = JSON.parse(raw);
    for (var key in accounts) {
    if (accounts.hasOwnProperty(key)) {
    val = JSON.stringify(accounts[key]).replace(/\\/g,'').slice(1,-1);
    console.log(key + " -> " + val);
    localStorage.setItem(key, val);
    }
    }
    1. Refresh Polkadot-JS App browser and check the Accounts and Addresses pages. All of your accounts -and addresses should now be available.
    - +and addresses should now be available. + \ No newline at end of file diff --git a/docs/learn-account-generation.html b/docs/learn-account-generation.html index 31a63449087c..ef7c7f1c15ef 100644 --- a/docs/learn-account-generation.html +++ b/docs/learn-account-generation.html @@ -19,7 +19,7 @@ - + @@ -141,7 +141,7 @@ encrypting/decrypting your wallet. If you cannot load a JSON file, please use the latest version of the wallet software. If you cannot load it, ensure that the wallet software uses the newest version of the Polkadot API.

    - + \ No newline at end of file diff --git a/docs/learn-account-multisig.html b/docs/learn-account-multisig.html index 8b7d141c762a..cb30ef419f06 100644 --- a/docs/learn-account-multisig.html +++ b/docs/learn-account-multisig.html @@ -19,7 +19,7 @@ - + @@ -114,7 +114,7 @@ Check the "How to use a multisig account" in the support docs on how to decode the multisig call data.

    - + \ No newline at end of file diff --git a/docs/learn-accounts-index.html b/docs/learn-accounts-index.html index 35ea5a672b9b..ea64d2f307ab 100644 --- a/docs/learn-accounts-index.html +++ b/docs/learn-accounts-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-accounts.html b/docs/learn-accounts.html index c84254489a5c..e3575a0ba1c7 100644 --- a/docs/learn-accounts.html +++ b/docs/learn-accounts.html @@ -19,7 +19,7 @@ - + @@ -140,7 +140,7 @@ multi-signature accounts, including their use-cases.

    Resources

    - + \ No newline at end of file diff --git a/docs/learn-advanced-index.html b/docs/learn-advanced-index.html index 92f3eb308504..07bba286c0a4 100644 --- a/docs/learn-advanced-index.html +++ b/docs/learn-advanced-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-architecture-index.html b/docs/learn-architecture-index.html index cc98ad8feae9..709d1651d67e 100644 --- a/docs/learn-architecture-index.html +++ b/docs/learn-architecture-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-architecture.html b/docs/learn-architecture.html index 9056ca000922..7df867882121 100644 --- a/docs/learn-architecture.html +++ b/docs/learn-architecture.html @@ -19,7 +19,7 @@ - + @@ -86,7 +86,7 @@ verify their validity (and later, their availability).


    Whiteboard Series

    For a video overview of the architecture of Polkadot watch the video below for the whiteboard interview with W3F researcher Alistair Stewart:

    - + \ No newline at end of file diff --git a/docs/learn-archive-index.html b/docs/learn-archive-index.html index 1bfbc44943e5..970e8abf9872 100644 --- a/docs/learn-archive-index.html +++ b/docs/learn-archive-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-assets-index.html b/docs/learn-assets-index.html index ed8708cc25fd..999fbaaa2a98 100644 --- a/docs/learn-assets-index.html +++ b/docs/learn-assets-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-assets.html b/docs/learn-assets.html index 581e8b4851f8..361a182eb689 100644 --- a/docs/learn-assets.html +++ b/docs/learn-assets.html @@ -19,7 +19,7 @@ - + @@ -126,7 +126,7 @@ create a 2-of-2 multisig from two pure proxies, and then set members from each group as proxies to those two accounts.

    - + \ No newline at end of file diff --git a/docs/learn-async-backing.html b/docs/learn-async-backing.html index 3fef8af7d62f..3dc1eb6e9164 100644 --- a/docs/learn-async-backing.html +++ b/docs/learn-async-backing.html @@ -19,7 +19,7 @@ - + @@ -73,7 +73,7 @@ resources:

    - + \ No newline at end of file diff --git a/docs/learn-auction.html b/docs/learn-auction.html index eb21d01a1c5c..305c37255e93 100644 --- a/docs/learn-auction.html +++ b/docs/learn-auction.html @@ -19,7 +19,7 @@ - + @@ -143,7 +143,7 @@ W3F research page on parachain allocation that goes more in depth to the mechanism
  • Research Update: The Case for Candle Auctions - W3F breakdown and research update about candle auctions
  • Front-Running, Smart Contracts, and Candle Auctions W3F Research team discusses how to remedy current blockchain auction setbacks with candle auctions
  • - + \ No newline at end of file diff --git a/docs/learn-balance-transfers.html b/docs/learn-balance-transfers.html index 6678386807c7..bddfc7df9fa5 100644 --- a/docs/learn-balance-transfers.html +++ b/docs/learn-balance-transfers.html @@ -19,7 +19,7 @@ - + @@ -101,7 +101,7 @@ probably not the reason for your tokens having existing references.

    Existing Non-Native Assets

    Currently, Polkadot does not use the Assets Pallet, so this is probably not the reason for your tokens having existing references.

    - + \ No newline at end of file diff --git a/docs/learn-basics-index.html b/docs/learn-basics-index.html index b153e54c84b2..780f5e9bc2da 100644 --- a/docs/learn-basics-index.html +++ b/docs/learn-basics-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-bridges.html b/docs/learn-bridges.html index 0c75825b8616..c05498cc917e 100644 --- a/docs/learn-bridges.html +++ b/docs/learn-bridges.html @@ -19,7 +19,7 @@ - + @@ -88,7 +88,7 @@ Network's implementation of Parity's bridge chain solution.
  • Edgeth Bridge - a bridge from Ethereum to Edgeware chain (a Substrate-based chain) - now defunct and not maintained, but a good example.
  • XCLAIM - XCLAIM is a framework for achieving trustless and efficient cross-chain exchanges using cryptocurrency-backed assets.
  • - + \ No newline at end of file diff --git a/docs/learn-collator.html b/docs/learn-collator.html index c7a6558d1e42..bde081fb80e5 100644 --- a/docs/learn-collator.html +++ b/docs/learn-collator.html @@ -19,7 +19,7 @@ - + @@ -65,7 +65,7 @@ Cumulus repository. More information can be found under the Cumulus section on the build parachain page.

    Guides and Tools

    - + \ No newline at end of file diff --git a/docs/learn-comparisons-avalanche.html b/docs/learn-comparisons-avalanche.html index a9cfc6acf5a9..eca0663e8e1f 100644 --- a/docs/learn-comparisons-avalanche.html +++ b/docs/learn-comparisons-avalanche.html @@ -19,7 +19,7 @@ - + @@ -113,7 +113,7 @@ need a recommended minimum of 5 validators, which make the costs of launch predictable. Avalanche has plans to implement shared security, interoperability, composability and on-chain governance features which are already offered by Polkadot.

    References

    1. The Avalanche Platform Whitepaper
    2. The Avalanche Consensus Whitepaper
    3. The AVAX Token Dynamics Paper
    4. Nakomoto vs Snow consensus
    - + \ No newline at end of file diff --git a/docs/learn-comparisons-cosmos.html b/docs/learn-comparisons-cosmos.html index c540b8d27612..3d0cd3aa584e 100644 --- a/docs/learn-comparisons-cosmos.html +++ b/docs/learn-comparisons-cosmos.html @@ -19,7 +19,7 @@ - + @@ -132,7 +132,7 @@ chain must trust the sending chain. Thus, each blockchain in the Cosmos network has its independent security mechanisms. They're independently secured and do not rely on the security of other blockchains or the hub.

    - + \ No newline at end of file diff --git a/docs/learn-comparisons-ethereum-2.html b/docs/learn-comparisons-ethereum-2.html index 58d911d0eb24..38dbbf92257b 100644 --- a/docs/learn-comparisons-ethereum-2.html +++ b/docs/learn-comparisons-ethereum-2.html @@ -19,7 +19,7 @@ - + @@ -158,7 +158,7 @@ enacted autonomously via forkless upgrades.
  • Validator selection mechanisms differ as Polkadot can provide strong availability and validity guarantees with fewer validators per shard.
  • - + \ No newline at end of file diff --git a/docs/learn-comparisons-index.html b/docs/learn-comparisons-index.html index bb861ea91503..1362b0228ed8 100644 --- a/docs/learn-comparisons-index.html +++ b/docs/learn-comparisons-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-comparisons-kusama.html b/docs/learn-comparisons-kusama.html index cac819a37164..598915d4bab3 100644 --- a/docs/learn-comparisons-kusama.html +++ b/docs/learn-comparisons-kusama.html @@ -19,7 +19,7 @@ - + @@ -76,7 +76,7 @@ the future, we’re also likely to see Kusama bridged to Polkadot for cross-network interoperability. Web3 Foundation remains committed to both networks going forward, providing crucial support and guidance to teams building for the ecosystem.

    Explore more

    - + \ No newline at end of file diff --git a/docs/learn-comparisons-rollups.html b/docs/learn-comparisons-rollups.html index e42102d7df19..b06dcc3f5d1f 100644 --- a/docs/learn-comparisons-rollups.html +++ b/docs/learn-comparisons-rollups.html @@ -19,7 +19,7 @@ - + @@ -94,7 +94,7 @@ transition data.

    Despite these drawbacks, Polkadot remains upgradable through forkless upgrades, which allows the protocol to be easily upgradable to stay in line with future technological advances.

    - + \ No newline at end of file diff --git a/docs/learn-comparisons.html b/docs/learn-comparisons.html index 74dcbfd174d2..a3bb9be32fad 100644 --- a/docs/learn-comparisons.html +++ b/docs/learn-comparisons.html @@ -19,7 +19,7 @@ - + @@ -61,7 +61,7 @@ Chain, and as the number of validators in the active set on Polkadot are increased, more parachains can be supported.

    - + \ No newline at end of file diff --git a/docs/learn-components-index.html b/docs/learn-components-index.html index c416857d33e4..fa07387ba20c 100644 --- a/docs/learn-components-index.html +++ b/docs/learn-components-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-consensus.html b/docs/learn-consensus.html index b9666663706b..a94332be11d6 100644 --- a/docs/learn-consensus.html +++ b/docs/learn-consensus.html @@ -19,7 +19,7 @@ - + @@ -158,7 +158,7 @@ with Bill Laboon.
  • Block Production and Finalization in Polkadot: Understanding the BABE and GRANDPA Protocols - An academic talk by Bill Laboon, given at MIT Cryptoeconomic Systems 2020, describing Polkadot's hybrid consensus model in-depth.
  • - + \ No newline at end of file diff --git a/docs/learn-controller.html b/docs/learn-controller.html index 320c0862a4b7..2b924f9b8b95 100644 --- a/docs/learn-controller.html +++ b/docs/learn-controller.html @@ -19,7 +19,7 @@ - + @@ -41,7 +41,7 @@ used less often and usually signed by the stash.

    stash-not-as-controller

    From a practical perspective, there were two accounts, and we needed to remember two passwords. From a security perspective, the party who wanted to control our staking actions was required to control two accounts.

    - + \ No newline at end of file diff --git a/docs/learn-crowdloans.html b/docs/learn-crowdloans.html index 368f0a38d766..28eebc0690c8 100644 --- a/docs/learn-crowdloans.html +++ b/docs/learn-crowdloans.html @@ -19,7 +19,7 @@ - + @@ -97,7 +97,7 @@ Apps page.

    Here is an example of the crowdloans in play during the very first Kusama auction.

    crowdloan dashboard

    Furthermore, check out this video on How to Participate in Crowdloans for steps on how to access available crowdloans on PolkadotJS apps.

    - + \ No newline at end of file diff --git a/docs/learn-cryptography.html b/docs/learn-cryptography.html index 5e4988fa8d7b..1e24511aabd0 100644 --- a/docs/learn-cryptography.html +++ b/docs/learn-cryptography.html @@ -19,7 +19,7 @@ - + @@ -175,7 +175,7 @@ make passive attacks much harder if such a backdoor exists.

    However an alternative exists in the form of Curve25519. This algorithm has been proposed in 2006 by DJB [Curve25519]. Its main strengths are its speed, its constant-time run time (and resistance against side-channel attacks), and its lack of nebulous hard-coded constants.

    - + \ No newline at end of file diff --git a/docs/learn-extrinsics.html b/docs/learn-extrinsics.html index 9756eb835282..09b10df23e03 100644 --- a/docs/learn-extrinsics.html +++ b/docs/learn-extrinsics.html @@ -19,7 +19,7 @@ - + @@ -101,7 +101,7 @@ without the possibility of verifying it.

    Defense against Attacks

    danger

    If you can't verify the extrinsic or you suspect you are signing something different than what you intended, don't sign it!

    To avoid being victim of an attack:

    • Use only trusted extensions, sites and software in general.
    • Use cold storage options (Ledger, Signer) and verify on them. Trust what these devices tell you over what is shown in the app or the browser extension.
    • Update Signer metadata only from trusted sources (or do it yourself).
    • Accept metadata updates for the extension only from trusted apps.
    - + \ No newline at end of file diff --git a/docs/learn-future-implementations-index.html b/docs/learn-future-implementations-index.html index aedeba83e07b..358cdb0a5dcb 100644 --- a/docs/learn-future-implementations-index.html +++ b/docs/learn-future-implementations-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-governance.html b/docs/learn-governance.html index 39eb8003e1e8..a8430a3444d8 100644 --- a/docs/learn-governance.html +++ b/docs/learn-governance.html @@ -19,7 +19,7 @@ - + @@ -240,7 +240,7 @@ case for why the change should be made.

    Resources

    - + \ No newline at end of file diff --git a/docs/learn-guides-assets-create.html b/docs/learn-guides-assets-create.html index 71fe94362b96..293e99a5956d 100644 --- a/docs/learn-guides-assets-create.html +++ b/docs/learn-guides-assets-create.html @@ -19,7 +19,7 @@ - + @@ -60,7 +60,7 @@ an ID that has already been taken. After all the details are entered, click on the next button.

    Add Asset Metadata

    • Choose the admin, issuer and the freezer accounts for your asset and click on the create button.

    Asset managing accounts

    • Sign and submit the transaction (If you like to verify the transaction details before signing, you can click on the dropdown button pointed by the arrow in the snapshot below).

    Sign asset creating transaction

    If the transaction is successful, you should see the asset and its details displayed in the Network > Assets page on the Asset Hub.

    - + \ No newline at end of file diff --git a/docs/learn-guides-assets-index.html b/docs/learn-guides-assets-index.html index 1c9f8ed293dc..5a4c78dc987d 100644 --- a/docs/learn-guides-assets-index.html +++ b/docs/learn-guides-assets-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-guides-assets-ledger.html b/docs/learn-guides-assets-ledger.html index 78e92e86eefd..08a3d04bb561 100644 --- a/docs/learn-guides-assets-ledger.html +++ b/docs/learn-guides-assets-ledger.html @@ -19,7 +19,7 @@ - + @@ -95,7 +95,7 @@ here.
  • Transfer the desired amount as described above. If you want to send exactly the amount you want to teleport, don't forget take into account the fees for teleporting that will be deducted in the next step.
  • Teleport your tokens following the instructions you will find here.
  • Teleporting to a Ledger account from a non-Ledger account doesn't require these extra steps.

    Support

    If you need support, please visit the Polkadot Support page.

    - + \ No newline at end of file diff --git a/docs/learn-guides-identity.html b/docs/learn-guides-identity.html index 9291430b5509..8bb6e39f17aa 100644 --- a/docs/learn-guides-identity.html +++ b/docs/learn-guides-identity.html @@ -19,7 +19,7 @@ - + @@ -52,7 +52,7 @@ for each sub-identity. This reserved account balance is freed once you clear the identities on the account.

    Sub-identity example

    - + \ No newline at end of file diff --git a/docs/learn-guides-index.html b/docs/learn-guides-index.html index a643ecee0dae..b7aa75fd9875 100644 --- a/docs/learn-guides-index.html +++ b/docs/learn-guides-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-guides-polkadot-opengov.html b/docs/learn-guides-polkadot-opengov.html index 1899990e89db..f7be9fd2afb8 100644 --- a/docs/learn-guides-polkadot-opengov.html +++ b/docs/learn-guides-polkadot-opengov.html @@ -19,7 +19,7 @@ - + @@ -50,7 +50,7 @@ have been met. Failing to submit the decision deposit within a -day period will lead to a referendum timeout.

    - + \ No newline at end of file diff --git a/docs/learn-guides-staking-index.html b/docs/learn-guides-staking-index.html index 36a77106e62d..48f85037f869 100644 --- a/docs/learn-guides-staking-index.html +++ b/docs/learn-guides-staking-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-guides-staking-pools.html b/docs/learn-guides-staking-pools.html index fd9fb62b5634..d0142675c03b 100644 --- a/docs/learn-guides-staking-pools.html +++ b/docs/learn-guides-staking-pools.html @@ -19,7 +19,7 @@ - + @@ -63,7 +63,7 @@ Polkadot-JS UI Extrinsic Tab and issue the following extrisics:

    • nominationPools.claimPayoutOthers extrinsic specifying ALICE's account. This will claim the rewards as a free balance on ALICE's account.

    pools-payoutOthers

    • nominationPools.bondExtraOthers extrinsic specifying ALICE's account and the option to bond:
      • the free balance currently available in ALICE's account (FreeBalance) or
      • the pool rewards (Rewards) unclaimed by ALICE.

    pools-bondExtraOthers

    - + \ No newline at end of file diff --git a/docs/learn-guides-staking.html b/docs/learn-guides-staking.html index 178d58d26149..4bda1e85cec0 100644 --- a/docs/learn-guides-staking.html +++ b/docs/learn-guides-staking.html @@ -19,7 +19,7 @@ - + @@ -39,7 +39,7 @@ which will list all the pending payouts for your stashes.

    pending-payouts

    To then claim your reward, select the "Payout all" button. This will prompt you to select your stash accounts for payout.

    select-payouts

    Once you are done with payout, another screen will appear asking for you to sign and submit the transaction.

    transaction-payouts

    - + \ No newline at end of file diff --git a/docs/learn-guides-treasury.html b/docs/learn-guides-treasury.html index 75bbddbca374..3c0cde0e14b1 100644 --- a/docs/learn-guides-treasury.html +++ b/docs/learn-guides-treasury.html @@ -19,7 +19,7 @@ - + @@ -62,7 +62,7 @@ to the 32 / Small Spender track, you will need to submit it to the 30 / Small Tipper or 31 / Big Tipper tracks depending on the number of tokens to be requested.

    Briefly, you will need to:

    • Create a preimage using the treasury.Spend extrinsic and specifying the number of tokens and the beneficiary of the tip, and
    • Submit a proposal to the right track (i.e. 30 or 31) using the preimage hash.
    - + \ No newline at end of file diff --git a/docs/learn-guides-vault.html b/docs/learn-guides-vault.html index fb58e0479cf4..9badc79f1312 100644 --- a/docs/learn-guides-vault.html +++ b/docs/learn-guides-vault.html @@ -19,7 +19,7 @@ - + @@ -70,7 +70,7 @@ chain and version is the version of the metadata.

    Add the renamed files to the /public/qr folder within the Metadata Portal repository.

    Run Portal

    Open the terminal within the Metadata Portal repository and run make updater. Then run make collector; this will create the _latest.apng files for each of the chains (removed by the command make cleaner). Finally, run yarn start to load the metadata portal on your localhost.

    - + \ No newline at end of file diff --git a/docs/learn-identity.html b/docs/learn-identity.html index b3e36d4eeb35..bc851d7dd632 100644 --- a/docs/learn-identity.html +++ b/docs/learn-identity.html @@ -19,7 +19,7 @@ - + @@ -105,7 +105,7 @@ an identity also clears all sub accounts and returns their deposits.

    Visit the section "Clear an Identity" on

    this support article for guidelines about clearing identities.

    Killing: The Council can kill an identity that it deems erroneous. This results in a slash of the deposit.

    - + \ No newline at end of file diff --git a/docs/learn-implementations.html b/docs/learn-implementations.html index c433d9f2529f..d246f420a66b 100644 --- a/docs/learn-implementations.html +++ b/docs/learn-implementations.html @@ -19,7 +19,7 @@ - + @@ -57,7 +57,7 @@ collection of tools, interfaces, and libraries for Polkadot and Substrate.

    Other implementations that have received grants

    While the ecosystem continues to grow rapidly, the continued development of alternative implementations will only make Polkadot stronger. Consider becoming a contributor to the ecosystem, and learn about the how you can receieve a grant for your development.

    - + \ No newline at end of file diff --git a/docs/learn-index.html b/docs/learn-index.html index 24fa361cdd72..2195ae329afd 100644 --- a/docs/learn-index.html +++ b/docs/learn-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-inflation.html b/docs/learn-inflation.html index 2dfa085f42a4..e752494f2935 100644 --- a/docs/learn-inflation.html +++ b/docs/learn-inflation.html @@ -19,7 +19,7 @@ - + @@ -72,7 +72,7 @@ incentivizing them to stake more tokens on the network. On the contrary, staking rewards drop if staked tokens exceed the ideal staking rate. This results from the change in the percentage of staking rewards that go to the Treasury.

    - + \ No newline at end of file diff --git a/docs/learn-launch.html b/docs/learn-launch.html index 904990a56c5f..5881b2715218 100644 --- a/docs/learn-launch.html +++ b/docs/learn-launch.html @@ -19,7 +19,7 @@ - + @@ -47,7 +47,7 @@ block number 1_205_128 on August 18, 2020, at 16:39 UTC.

    Core Functionality

    After five years of research and development and a multi-stage launch that began in May 2020, Polkadot launch was completed on December 18, 2021, with all auction-winning parachains producing blocks on the network.

    Check out these resources for further information:

    - + \ No newline at end of file diff --git a/docs/learn-nft-index.html b/docs/learn-nft-index.html index f8c7c8e45ca9..2cd82ce738ba 100644 --- a/docs/learn-nft-index.html +++ b/docs/learn-nft-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-nft-pallets.html b/docs/learn-nft-pallets.html index 5f6d5375be31..22fb5967cf70 100644 --- a/docs/learn-nft-pallets.html +++ b/docs/learn-nft-pallets.html @@ -19,7 +19,7 @@ - + @@ -108,7 +108,7 @@ balance-keeping chain for both fungible and non-fungibles.

    These NFTs can be viewed and interacted with on RMRK's Singular platform, by switching the top right menu from Kusama to the Asset Hub.

    nft-hub

    They can also be interacted with directly through the extrinsics tab of the Asset Hub:

    uniques.png

    - + \ No newline at end of file diff --git a/docs/learn-nft-projects.html b/docs/learn-nft-projects.html index dddf75f981fb..dab9fd5b74df 100644 --- a/docs/learn-nft-projects.html +++ b/docs/learn-nft-projects.html @@ -19,7 +19,7 @@ - + @@ -99,7 +99,7 @@ on, rather than entering the NFT space themselves as an end-product.

    Unique Network aims to make their marketplace technology open-source and whitelabel-friendly. In theory, it should be trivial to set up a new marketplace for your project using Unique's technology. Unique network aims to be a parachain on Polkadot, and Quartz is their Kusama counterpart.

    - + \ No newline at end of file diff --git a/docs/learn-nft.html b/docs/learn-nft.html index 360b51f1a3c0..1a70b1c3b905 100644 --- a/docs/learn-nft.html +++ b/docs/learn-nft.html @@ -19,7 +19,7 @@ - + @@ -64,7 +64,7 @@ RMRK hackathon for porting RMRK NFTs into simplified IOUs on EVM chains

    References

    - + \ No newline at end of file diff --git a/docs/learn-nomination-pools.html b/docs/learn-nomination-pools.html index 309291f22ea2..2daa714a4aa6 100644 --- a/docs/learn-nomination-pools.html +++ b/docs/learn-nomination-pools.html @@ -19,7 +19,7 @@ - + @@ -201,7 +201,7 @@ in the nomination pools and earn staking rewards. For additional information, see this blog post. Check the wiki doc on nomination pools for more information.

    NominatingJoining a Pool
    Minimum 250 DOT to nominate.Minimum 1 DOT to be a member.
    Rewards can be compounded automatically or sent to any account.Rewards can be manually claimed to the pool member's account and be bonded in the pool again to compound them.
    If the active validator gets slashed, all active nominators are subjected to slashing, also those that do not receive rewards due to the oversubscription issue.If the active validator gets slashed, all pool members are subjected to slashing.
    Can bond and stake DOT indefinitely.Can bond and stake DOT until the pool exists.
    Unbonding period of 28 days. Can switch validators without unbonding.Unbonding period of 28 days. Need to unbond before switching to a different pool.
    Maximum uncapped.Maximum uncapped.
    Should bond more than the minimum active nomination in an era to be eligible to earn staking rewards, although it can depend on multiple other factors outlined in the linked document.A nomination pool earns rewards in an era if it satisfies all the conditions mentioned for the nominator (as the nomination pool is just a nominator from the NPoS system perspective).
    Staked tokens can be used for participation in Governance.Staked tokens cannot be used for participation in Governance.
    Rewards payout can be triggered permissionlessly by anyone (typically done by the validator).The pool member must claim the rewards.
    Bonded funds remain in your account.Bonded funds are transferred to a pool account which is administered by the network protocol and is not accessible to anyone else. See System Accounts for more information.
    Nominator manages the list of staked validators (up to 16).Nominations managed by the pool operator.
    - + \ No newline at end of file diff --git a/docs/learn-nominator.html b/docs/learn-nominator.html index e00f6f0def45..5a59b6c5d6bd 100644 --- a/docs/learn-nominator.html +++ b/docs/learn-nominator.html @@ -19,7 +19,7 @@ - + @@ -270,7 +270,7 @@ Polkadot JS Apps > Network > Staking > Targets page.

    Minimum Active Nomination

    Guides

    - + \ No newline at end of file diff --git a/docs/learn-parachains-faq.html b/docs/learn-parachains-faq.html index 837b26dce718..4ad9f86d97bb 100644 --- a/docs/learn-parachains-faq.html +++ b/docs/learn-parachains-faq.html @@ -19,7 +19,7 @@ - + @@ -111,7 +111,7 @@ initiate an auction, however, Root origin (via referendum) is needed to cancel an auction. Here is a proposal that gives a glimpse of what goes into planning auctions schedule - Proposed Polkadot Auction Schedule 2022.

    - + \ No newline at end of file diff --git a/docs/learn-parachains-index.html b/docs/learn-parachains-index.html index 96ea0e8c60a5..5b7cc8610317 100644 --- a/docs/learn-parachains-index.html +++ b/docs/learn-parachains-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-parachains-protocol.html b/docs/learn-parachains-protocol.html index a7a90c432a09..9a8db201d965 100644 --- a/docs/learn-parachains-protocol.html +++ b/docs/learn-parachains-protocol.html @@ -19,7 +19,7 @@ - + @@ -268,7 +268,7 @@ Parity analyst Joe Petrowski expounds on the validity checks that a parachain block must pass in order to progress the parachain.
  • Availability and Validity - Paper by the W3F Research Team that specifies the availability and validity protocol in detail.
  • - + \ No newline at end of file diff --git a/docs/learn-parachains.html b/docs/learn-parachains.html index 3bc0cd86f746..a1e98f0f2d9c 100644 --- a/docs/learn-parachains.html +++ b/docs/learn-parachains.html @@ -19,7 +19,7 @@ - + @@ -189,7 +189,7 @@ its own. The Relay Chain provides security to attached parachains, but also provides a guarantee of secure message-passing between them."
  • The Path of a Parachain Block - A technical walk-through of how parachains interact with the Relay Chain.
  • - + \ No newline at end of file diff --git a/docs/learn-parathreads.html b/docs/learn-parathreads.html index 9ef3d9fa909b..454e0e79f9ec 100644 --- a/docs/learn-parathreads.html +++ b/docs/learn-parathreads.html @@ -19,7 +19,7 @@ - + @@ -90,7 +90,7 @@ produce new blocks when they need to.

    Parathreads help ease the sharp stop of the parachain slot term by allowing parachains that are still doing something useful to produce blocks, even if it is no longer economically viable to rent a parachain slot.

    Resources

    - + \ No newline at end of file diff --git a/docs/learn-participants-index.html b/docs/learn-participants-index.html index 1cff31645bca..b1682c0d94a6 100644 --- a/docs/learn-participants-index.html +++ b/docs/learn-participants-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-phragmen.html b/docs/learn-phragmen.html index c955cf5cd01a..5a067bc8b3a2 100644 --- a/docs/learn-phragmen.html +++ b/docs/learn-phragmen.html @@ -19,7 +19,7 @@ - + @@ -272,7 +272,7 @@ This paper by Brill et al. is the source for the simple Phragmén method, along with proofs about its properties.
  • Offline Phragmén - Script to generate the Phragmén validator election outcome before the start of an era.
  • - + \ No newline at end of file diff --git a/docs/learn-polkadot-host.html b/docs/learn-polkadot-host.html index 23ae5e9690b5..f7bad9ebed36 100644 --- a/docs/learn-polkadot-host.html +++ b/docs/learn-polkadot-host.html @@ -19,7 +19,7 @@ - + @@ -45,7 +45,7 @@ Host is referred to as the Executor. For additional technical implementation details, check out this section of the Polkadot Spec.

    Resources

    - + \ No newline at end of file diff --git a/docs/learn-polkadot-opengov-treasury.html b/docs/learn-polkadot-opengov-treasury.html index 2e8bada4955a..7669d8214f90 100644 --- a/docs/learn-polkadot-opengov-treasury.html +++ b/docs/learn-polkadot-opengov-treasury.html @@ -19,7 +19,7 @@ - + @@ -57,7 +57,7 @@ requires a decision deposit of 10 DOT.

    Small Tipper

    This track can be used for treasury spending requests up to 100 DOT per referendum. Each referendum requires a decision deposit of 1 DOT.

    - + \ No newline at end of file diff --git a/docs/learn-polkadot-opengov.html b/docs/learn-polkadot-opengov.html index 1427ddb760a8..3837c7ae753d 100644 --- a/docs/learn-polkadot-opengov.html +++ b/docs/learn-polkadot-opengov.html @@ -19,7 +19,7 @@ - + @@ -293,7 +293,7 @@ these guidelines.

    Future plans include that public members can apply to become a Fellowship candidate by placing a small deposit (which will be returned once they become members). Their candidacy will go through a referendum to be approved to become a member.

    Resources

    - + \ No newline at end of file diff --git a/docs/learn-proxies.html b/docs/learn-proxies.html index 96325d9b7214..e9770b28f303 100644 --- a/docs/learn-proxies.html +++ b/docs/learn-proxies.html @@ -19,7 +19,7 @@ - + @@ -244,7 +244,7 @@ transfer of some tokens from ABC to Dan. Then, Charly does the same to confirm the transaction. Note that Charly will need to pay for some weight, for the computation that is necessary to execute the transaction.

    - + \ No newline at end of file diff --git a/docs/learn-redenomination.html b/docs/learn-redenomination.html index ec7c6bfd2e2c..63f285b04c62 100644 --- a/docs/learn-redenomination.html +++ b/docs/learn-redenomination.html @@ -19,7 +19,7 @@ - + @@ -84,7 +84,7 @@ Ecosystem Redenomination Guide for recommendations.

    Please reach out to support@polkadot.network if you need any assistance in making sure your software is compatible with the redenomination.

    - + \ No newline at end of file diff --git a/docs/learn-runtime-upgrades.html b/docs/learn-runtime-upgrades.html index b9403c7caea1..83d6fa647a8d 100644 --- a/docs/learn-runtime-upgrades.html +++ b/docs/learn-runtime-upgrades.html @@ -19,7 +19,7 @@ - + @@ -84,7 +84,7 @@ may be up to the last block before execution, but it will not work if this is missing.
  • democracy(Executed) events for actual execution. In the case of a runtime upgrade, there will also be a system(CodeUpdated) event.
  • You can also monitor Polkassembly for discussions on on-chain proposals and referenda.

    * E.g. via pallets/democracy/storage/ReferendumInfoOf?key1=index&at=blockNumber on Sidecar.

    - + \ No newline at end of file diff --git a/docs/learn-scams.html b/docs/learn-scams.html index 926e63dd13a5..8463cd7d8953 100644 --- a/docs/learn-scams.html +++ b/docs/learn-scams.html @@ -19,7 +19,7 @@ - + @@ -82,7 +82,7 @@ for steps you should take to prevent further loss and contact Polkadot Support from the same page. Finally, make sure to read the present article carefully to learn how to avoid falling victim in the future.

    - + \ No newline at end of file diff --git a/docs/learn-spree.html b/docs/learn-spree.html index babb10d91c28..11c6436e0197 100644 --- a/docs/learn-spree.html +++ b/docs/learn-spree.html @@ -19,7 +19,7 @@ - + @@ -78,7 +78,7 @@ instances, and the next state root of the instance. They do this validation by checking it against the validate function as provided by the SPREE module API. Collators are expected to be able to provide this information to progress their parachains.

    - + \ No newline at end of file diff --git a/docs/learn-staking-advanced.html b/docs/learn-staking-advanced.html index e1a4d8a29fce..05ba0aae5c8e 100644 --- a/docs/learn-staking-advanced.html +++ b/docs/learn-staking-advanced.html @@ -19,7 +19,7 @@ - + @@ -313,7 +313,7 @@ which is a fixed amount.

    Further Resources

    If you want to run a staking miner on your validator, refer to the repository provided in the resources section below.

    - + \ No newline at end of file diff --git a/docs/learn-staking-index.html b/docs/learn-staking-index.html index 16163d599681..3023e63044c0 100644 --- a/docs/learn-staking-index.html +++ b/docs/learn-staking-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-staking.html b/docs/learn-staking.html index 4520e4e08908..b084de1ce9c1 100644 --- a/docs/learn-staking.html +++ b/docs/learn-staking.html @@ -19,7 +19,7 @@ - + @@ -355,7 +355,7 @@ this support page for the FAQs about staking.

    Resources

    - + \ No newline at end of file diff --git a/docs/learn-system-chains.html b/docs/learn-system-chains.html index a7f4cb7568e1..0a9b08056220 100644 --- a/docs/learn-system-chains.html +++ b/docs/learn-system-chains.html @@ -19,7 +19,7 @@ - + @@ -87,7 +87,7 @@ isolation provided by parachains.

    See the Bridges page for information on the latest bridge projects. Currently, a Bridge Hub parachain is in development that will be a portal for trust-minimized bridges to other networks.

    - + \ No newline at end of file diff --git a/docs/learn-teleport.html b/docs/learn-teleport.html index d8419c34fb48..d5a4cb9b5e2f 100644 --- a/docs/learn-teleport.html +++ b/docs/learn-teleport.html @@ -19,7 +19,7 @@ - + @@ -50,7 +50,7 @@ condition will result in a change in the asset's total issuance (in the case of fungible tokens) or a complete loss/duplication of an NFT.

    Teleporting Tokens using the Polkadot-JS UI

    Troubleshooting

    If you do not see "Accounts > Teleport" in [Polkadot-JS UI], the source chain that you have selected does not support teleportation yet.

    - + \ No newline at end of file diff --git a/docs/learn-transaction-fees.html b/docs/learn-transaction-fees.html index bc2f33efde40..dacc8eda69e2 100644 --- a/docs/learn-transaction-fees.html +++ b/docs/learn-transaction-fees.html @@ -19,7 +19,7 @@ - + @@ -142,7 +142,7 @@ how reasonable they find the timestamp. In Polkadot, it must be within some acceptable range of their own system clocks.

    Learn More

    - + \ No newline at end of file diff --git a/docs/learn-transactions-index.html b/docs/learn-transactions-index.html index 99e696322fc2..cbc0ffd59e80 100644 --- a/docs/learn-transactions-index.html +++ b/docs/learn-transactions-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-treasury.html b/docs/learn-treasury.html index d18e762645fb..874964ea3087 100644 --- a/docs/learn-treasury.html +++ b/docs/learn-treasury.html @@ -19,7 +19,7 @@ - + @@ -170,7 +170,7 @@ taking place. The time delay then allows chain participants time to respond. The response may take the form of governance measures or - in the most extreme cases a liquidation of their holdings and a migration to a minority fork. However, the possibility of this scenario is quite low.

    Further Reading

    - + \ No newline at end of file diff --git a/docs/learn-validator.html b/docs/learn-validator.html index b769b40463d1..d2d579dd1d8d 100644 --- a/docs/learn-validator.html +++ b/docs/learn-validator.html @@ -19,7 +19,7 @@ - + @@ -95,7 +95,7 @@ statistics.
  • YieldScan - Staking yield maximization platform, designed to minimize effort.
  • Subscan Validators Page - Displays information on the current validators - not as tailored for validators as the other sites.
  • - + \ No newline at end of file diff --git a/docs/learn-video-tutorials.html b/docs/learn-video-tutorials.html index eaa858b52185..7f4e05548b5b 100644 --- a/docs/learn-video-tutorials.html +++ b/docs/learn-video-tutorials.html @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/docs/learn-wasm.html b/docs/learn-wasm.html index 21c3767c5921..22a45bb54373 100644 --- a/docs/learn-wasm.html +++ b/docs/learn-wasm.html @@ -19,7 +19,7 @@ - + @@ -35,7 +35,7 @@ spec.
  • Wasmi - WebAssembly interpreter written in Rust.
  • Parity Wasm - WebAssembly serialization/deserialization in Rust.
  • Wasm utils - Collection of Wasm utilities used in Parity and Wasm contract development.
  • - + \ No newline at end of file diff --git a/docs/learn-xcm-index.html b/docs/learn-xcm-index.html index 23a1f13132af..c44c18bf8f91 100644 --- a/docs/learn-xcm-index.html +++ b/docs/learn-xcm-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn-xcm-instructions.html b/docs/learn-xcm-instructions.html index b0bdf888926a..03d522de8607 100644 --- a/docs/learn-xcm-instructions.html +++ b/docs/learn-xcm-instructions.html @@ -19,7 +19,7 @@ - + @@ -37,7 +37,7 @@ system and may not be transferred. It may only be unlocked with the receipt of the UnlockAsset instruction from this chain.

  • RequestUnlock(MultiAsset, MultiLocation) - Send an UnlockAsset instruction to the locker for the given asset.

  • - + \ No newline at end of file diff --git a/docs/learn-xcm-pallet.html b/docs/learn-xcm-pallet.html index 17ba67cc5030..c1f9fece4117 100644 --- a/docs/learn-xcm-pallet.html +++ b/docs/learn-xcm-pallet.html @@ -19,7 +19,7 @@ - + @@ -86,7 +86,7 @@ calculates the total fee based on the number of instructions.

    The Trader used to calculate the weight (time for computation in consensus) to include in the message. Fee calculation in XCM is highly configurable and, for this reason, subjective to whichever configuration is in place.

    - + \ No newline at end of file diff --git a/docs/learn-xcm-transport.html b/docs/learn-xcm-transport.html index 6828755bfffb..a29c3e2b06ac 100644 --- a/docs/learn-xcm-transport.html +++ b/docs/learn-xcm-transport.html @@ -19,7 +19,7 @@ - + @@ -69,7 +69,7 @@ asset transfer as intended.

    The collator now hands this block to the validator, which itself will verify that this message was processed. If the message was processed and all other aspects of the block are valid, the validator will include this block for parachain B into the Relay Chain.

    - + \ No newline at end of file diff --git a/docs/learn-xcm-usecases.html b/docs/learn-xcm-usecases.html index 80360fabb425..a3688faef413 100644 --- a/docs/learn-xcm-usecases.html +++ b/docs/learn-xcm-usecases.html @@ -19,7 +19,7 @@ - + @@ -46,7 +46,7 @@ destination's sovereign account, and sends this instruction onwards to the destination. The destination receives the instruction and processes it, minting the derivative assets as a result of the process.

    1. DepositAsset

    The destination deposits the derivative assets minted to the receiving account.

    - + \ No newline at end of file diff --git a/docs/learn-xcm.html b/docs/learn-xcm.html index 2f367507330f..7e057af45753 100644 --- a/docs/learn-xcm.html +++ b/docs/learn-xcm.html @@ -19,7 +19,7 @@ - + @@ -92,7 +92,7 @@ Technical audit report by Quarkslab prepared for Parity.

  • XCM pallet code - The pallet that contains XCM logic from the Polkadot code repository

  • XCM Config & Pallet-XCM | Polkadot Deep Dives - A technical deep dive into pallet-xcm and the XCM configuration.

  • - + \ No newline at end of file diff --git a/docs/learn-xcvm.html b/docs/learn-xcvm.html index 9c9f184bacbd..5da4f509479d 100644 --- a/docs/learn-xcvm.html +++ b/docs/learn-xcvm.html @@ -19,7 +19,7 @@ - + @@ -110,7 +110,7 @@ a MultiLocation.

    Simulating XCVM using the xcm-simulator

    Within the Polkadot repository exists the xcm-simulator, which allows developers to experiment with building, executing, and simulating various XCM use scenarios.

    - + \ No newline at end of file diff --git a/docs/learn/xcm.html b/docs/learn/xcm.html index cc8082ed4835..4dc689a84db4 100644 --- a/docs/learn/xcm.html +++ b/docs/learn/xcm.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/config-deep-dive.html b/docs/learn/xcm/config-deep-dive.html index e96dfc693026..9aa0e5df69f1 100644 --- a/docs/learn/xcm/config-deep-dive.html +++ b/docs/learn/xcm/config-deep-dive.html @@ -19,7 +19,7 @@ - + @@ -132,7 +132,7 @@ Statemine, or Trappist for examples of how to implement the xcm-executor config.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals-fees.html b/docs/learn/xcm/fundamentals-fees.html index 1ec46c4d005b..33d6362009ba 100644 --- a/docs/learn/xcm/fundamentals-fees.html +++ b/docs/learn/xcm/fundamentals-fees.html @@ -19,7 +19,7 @@ - + @@ -56,7 +56,7 @@ and charging execution fees.

    XCM pallet

    FRAME pallets, like the XCM pallet, specify weights for each extrinsic they expose. That means that when interacting with pallets that deal with XCM, there will be an additional fee at the beginning for calling the extrinsic locally.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals-multiasset.html b/docs/learn/xcm/fundamentals-multiasset.html index 57f17a2fa9f6..f71922a7f8f5 100644 --- a/docs/learn/xcm/fundamentals-multiasset.html +++ b/docs/learn/xcm/fundamentals-multiasset.html @@ -19,7 +19,7 @@ - + @@ -56,7 +56,7 @@ MultiAssets and WildMultiAsset allowing either a wildcard or a list of definite (i.e. not wildcard) assets to be specified.

    pub enum MultiAssetFilter {
    /// Specify the filter as being everything contained by the given `MultiAssets` inner.
    Definite(MultiAssets),
    /// Specify the filter as the given `WildMultiAsset` wildcard.
    Wild(WildMultiAsset),
    }

    Examples

    MultiAsset

    For more information about the MultiLocations used to define concrete assets, see MultiLocation and Junction.

    // Location Relay Chain
    // 100 Native Asset (three ways)
    MultiAsset {id: Concrete(MultiLocation {parents: 0, interior: Here}), fun: Fungible(100u128)};
    MultiAsset {id: Here.into(), fun: 100.into()};
    let _: MultiAsset = (Here, 100u128).into();

    // 100 Parachain's Native Asset
    let _: MultiAsset = (X1(Parachain(1000)), 100u128).into();
    // 100 Fungible assets in Parachain 1000 with id 1234
    let _: MultiAsset = (X2(Parachain(1000), GeneralIndex(1234)), 100u128).into();
    // Non Fungible asset with asset class 1234 containing only one nft instance in Parachain 1000
    let _: MultiAsset = (X2(Parachain(1000), GeneralIndex(1234)), Undefined).into();
    // Non Fungible asset with asset class 1234 and AssetInstance 1 in Parachain 1000
    let _: MultiAsset = (X2(Parachain(1000), GeneralIndex(1234)), Index(1)).into();

    MultiAssetFilter

    let a1: MultiAssets = MultiAssets::from(vec![MultiAsset {id: Here.into(), fun: 100u128.into()}]);
    let b1: MultiAssets = (Here, 100u128).into();
    assert_eq!(a1, b1);

    let a2: MultiAssetFilter = a1.into();
    let b2 = MultiAssetFilter::Definite((Here, 100u128).into());
    assert_eq!(a2, b2);

    let a3 = MultiAssetFilter::Wild(WildMultiAsset::All);
    let b3: MultiAssetFilter = All.into();
    assert_eq!(a3, b3);
    - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals-summary.html b/docs/learn/xcm/fundamentals-summary.html index 6cd44498908b..dd329991cd81 100644 --- a/docs/learn/xcm/fundamentals-summary.html +++ b/docs/learn/xcm/fundamentals-summary.html @@ -19,14 +19,14 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals-xcvm.html b/docs/learn/xcm/fundamentals-xcvm.html index 0c5b38e004cc..046e5fb178f5 100644 --- a/docs/learn/xcm/fundamentals-xcvm.html +++ b/docs/learn/xcm/fundamentals-xcvm.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals.html b/docs/learn/xcm/fundamentals.html index 681c07d68744..444fe771741e 100644 --- a/docs/learn/xcm/fundamentals.html +++ b/docs/learn/xcm/fundamentals.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals/multilocation-example.html b/docs/learn/xcm/fundamentals/multilocation-example.html index 9de906733e17..e62602964708 100644 --- a/docs/learn/xcm/fundamentals/multilocation-example.html +++ b/docs/learn/xcm/fundamentals/multilocation-example.html @@ -19,14 +19,14 @@ - +

    Example

    In this example we show different MultiLocations for the system hierarchy in the image below. Example

    From the perspective of RelayA

    // ParaA
    let _: MultiLocation = Parachain(1000).into();
    // AccountId32 in Parachain A
    let _: MultiLocation = (Parachain(1000), AccountId32 { network: RELAY_A_NETWORK, id: [0u8; 32]}).into();
    // Asset in Parachain A
    let _: MultiLocation = (Parachain(1000), PalletInstance(1), GeneralIndex(1)).into();
    // Ethereum based account on Parachain B
    let _: MultiLocation = (Parachain(2000), AccountKey20 { network: RELAY_A_NETWORK, key: [0u8; 20] }).into();
    // Smart Contract
    let _: MultiLocation = (Parachain(2000), PalletInstance(1), AccountKey20 { network: RELAY_A_NETWORK, key: [0u8; 20] }).into();
    // RelayB
    let _: MultiLocation = (Parent, GlobalConsensus(RELAY_B_NETWORK)).into();
    // NFT on Parachain C
    let _: MultiLocation = (Parent, GlobalConsensus(RELAY_B_NETWORK), Parachain(1000), GeneralIndex(1)).into();

    From the perspective of Parachain C

    // Relay A
    let _: MultiLocation = Parent.into();
    // Plurality Example. Many more BodyId/BodyPart combos imaginable
    let _: MultiLocation = (Parent, Plurality { id: BodyId::Index(0), part: BodyPart::Members { count: 10 } }).into();
    // Account in Relay
    let _: MultiLocation = (Parent, AccountId32 { network: None, id: [0u8; 32] }).into();

    From the perspective of the Smart Contract

    // Asset in Parachain A
    let _: MultiLocation = (Parent, Parent, Parachain(1000), PalletInstance(1), GeneralIndex(1)).into();

    - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals/multilocation-junctions.html b/docs/learn/xcm/fundamentals/multilocation-junctions.html index 39bee4e7f43c..2afbbd850a57 100644 --- a/docs/learn/xcm/fundamentals/multilocation-junctions.html +++ b/docs/learn/xcm/fundamentals/multilocation-junctions.html @@ -19,7 +19,7 @@ - + @@ -59,7 +59,7 @@ relay chain from the perspective of the Polkadot relay chain as {parents: 1, interior: GlobalConsensus(Kusama)}. An example use case could be routing XCMs between global consensus networks using bridges.

    Multiple ways to create a MultiLocation

    // Current Location
    MultiLocation {parents: 0, interior: Here};
    MultiLocation::new(0, Here);
    MultiLocation::here();
    MultiLocation::default();
    let _: MultiLocation = Here.into();

    // Parent Location
    MultiLocation {parents: 1, interior: Here};
    MultiLocation::parent();
    let _: MultiLocation = Parent.into();

    // Conversion
    MultiLocation { parents: 2, interior: X2(Parachain(1), GeneralIndex(1))};
    let _: MultiLocation = (Parent, Parent, Parachain(1), GeneralIndex(1)).into();
    - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals/multilocation-summary.html b/docs/learn/xcm/fundamentals/multilocation-summary.html index 57d02bca0904..680bfce94cbe 100644 --- a/docs/learn/xcm/fundamentals/multilocation-summary.html +++ b/docs/learn/xcm/fundamentals/multilocation-summary.html @@ -19,7 +19,7 @@ - + @@ -54,7 +54,7 @@ .. are followed by some number of Junctions, all separated by /. The X1 and X2 variants are expressing the number of Junctions that we step down in the hierarchical structure (see Junctions for an explanation).

    // From: RelayA
    // To: ParaB
    // Location: Parachain(2000)
    MultiLocation {parents: 0, interior: X1(Parachain(2000))};
    // To: Account in ParaA
    // Location: Parachain(1000)/AccountId32(0x00..)
    MultiLocation {
    parents: 0,
    interior: X2(
    Parachain(1000),
    AccountId32{network: None, id: [0u8; 32]}
    )
    };

    // From: ParaB
    // To: RelayA
    // Location: ../Here
    MultiLocation {parents: 1, interior: Here};
    // To: Account in ParaA
    // Location: ../Parachain(1000)/AccountId32(0x00..)
    MultiLocation {
    parents: 1,
    interior: X2(
    Parachain(1000),
    AccountId32{network: None, id: [0u8; 32]}
    )
    };

    What's next:

    • More information about junctions
    • More MultiLocation examples
    • Expressing assets using Multilocations: [MultiAsset][../multiasset.md]
    - + \ No newline at end of file diff --git a/docs/learn/xcm/fundamentals/multilocation.html b/docs/learn/xcm/fundamentals/multilocation.html index 6a7ef14908f5..5a475f47aedd 100644 --- a/docs/learn/xcm/fundamentals/multilocation.html +++ b/docs/learn/xcm/fundamentals/multilocation.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/introduction.html b/docs/learn/xcm/introduction.html index 79ca8c32d307..f6be730c6517 100644 --- a/docs/learn/xcm/introduction.html +++ b/docs/learn/xcm/introduction.html @@ -19,7 +19,7 @@ - + @@ -35,7 +35,7 @@ open an issue. If you want to contribute to the format, check out the RFC process.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-assets.html b/docs/learn/xcm/journey-assets.html index c3a1cae94be4..62d8e582d893 100644 --- a/docs/learn/xcm/journey-assets.html +++ b/docs/learn/xcm/journey-assets.html @@ -19,7 +19,7 @@ - + @@ -42,7 +42,7 @@ relay chain. The assets are trapped because an error is thrown and the execution is halted. Parachain A claims the trapped assets and receives a report of the holding register.

    Parachain A sends the following message to the relay chain. The message errors because of the Trap instruction, so all assets in the Holding Register are trapped.

    let message = Xcm(vec![
    WithdrawAsset((Here, 10 * CENTS).into()),
    BuyExecution { fees: (Here, CENTS).into(), weight_limit: WeightLimit::Unlimited },
    Trap(0), // <-- Errors
    DepositAsset { // <-- Not executed because of error.
    assets: All.into(),
    beneficiary: AccountId32 {
    network: Some(parachain::RelayNetwork::get()),
    id: ALICE.into()
    }.into()
    }
    ]);

    Parachain A claims the assets, reports them to itself and deposits them in the Account of Alice.

    let claim_message = Xcm(vec![
    ClaimAsset { assets: (Here, 10 * CENTS).into(), ticket: Here.into() },
    ReportHolding {
    response_info: QueryResponseInfo {
    destination: Parachain(1).into(),
    query_id: QUERY_ID,
    max_weight: Weight::from_parts(1_000_000_000, 64*64) },
    assets: All.into()
    },
    DepositAsset {
    assets: All.into(),
    beneficiary: AccountId32 {
    network: Some(parachain::RelayNetwork::get()),
    id: ALICE.into()
    }.into()
    },
    ]);
    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-channels.html b/docs/learn/xcm/journey-channels.html index 5c155c86a7ae..e2d76e457e96 100644 --- a/docs/learn/xcm/journey-channels.html +++ b/docs/learn/xcm/journey-channels.html @@ -19,7 +19,7 @@ - + @@ -51,7 +51,7 @@ network), you would call with network: NetworkId::Kusama and destination: X1(Parachain(1000)). Alternatively, to export a message for execution on Polkadot, you would call with network: NetworkId:: Polkadot and destination: Here.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-expectations.html b/docs/learn/xcm/journey-expectations.html index 416687e2a205..b01b84e91fb1 100644 --- a/docs/learn/xcm/journey-expectations.html +++ b/docs/learn/xcm/journey-expectations.html @@ -19,7 +19,7 @@ - + @@ -44,7 +44,7 @@ the error handler, when a specific error is thrown.

        ExpectError(Option<(u32, Error)>)

    Example

    For the full example, check here.

    SetErrorHandler(Xcm(vec![
    ExpectError(Some((1, XcmError::VersionIncompatible))),
    ReportError(QueryResponseInfo {
    destination: Parachain(1).into(),
    query_id: QUERY_ID,
    max_weight: Weight::from_all(0),
    }),
    ])),
    // Pallet index is wrong, so throws `PalletNotFound` error.
    ExpectPallet {
    index: 100,
    name: "Balances".into(),
    module_name: "pallet_balances".into(),
    crate_major: 4,
    min_crate_minor: 0,
    },

    ExpectTransactStatus

    The ExpectTransactStatus instruction throws an ExpectationFalse error if the transact status register does not equal the expected transact status.

    Example

    For the full example, check here. The transact status is reported to Parachain(1) if the call in the Transact errors.

    SetErrorHandler(Xcm(vec![ReportTransactStatus(QueryResponseInfo {
    destination: Parachain(1).into(),
    query_id: QUERY_ID,
    max_weight: Weight::from_all(0),
    })])),
    Transact {
    origin_kind: OriginKind::SovereignAccount,
    require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024),
    call: call.encode().into(),
    },
    ExpectTransactStatus(MaybeErrorCode::Success),
    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-fees.html b/docs/learn/xcm/journey-fees.html index 076c950c9cbb..d755d1b86bda 100644 --- a/docs/learn/xcm/journey-fees.html +++ b/docs/learn/xcm/journey-fees.html @@ -19,7 +19,7 @@ - + @@ -62,7 +62,7 @@ throws an error, the error handler will be called and the weight for all the instructions that weren't executed is refunded. For the full example, check our repo.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-holding.html b/docs/learn/xcm/journey-holding.html index f58428ff61d1..6eca92ea20d2 100644 --- a/docs/learn/xcm/journey-holding.html +++ b/docs/learn/xcm/journey-holding.html @@ -19,7 +19,7 @@ - + @@ -47,7 +47,7 @@ results could differ.

    The Assets in the exchange in Parachain(1). This is a custom exchange implementation just for testing purposes.

    let assets_in_exchange = vec![(Parent, 10 * CENTS).into()];
    parachain::set_exchange_assets(assets_in_exchange);

    The message that is send:

    let message = Xcm(vec![
    WithdrawAsset((Here, 10 * CENTS).into()),
    BuyExecution { fees: (Here, CENTS).into(), weight_limit: WeightLimit::Unlimited },
    // Maximal field set to true.
    ExchangeAsset {
    give: Definite((Here, 5 * CENTS).into()),
    want: (Parent, 5 * CENTS).into(),
    maximal: true,
    },
    DepositAsset {
    assets: AllCounted(2).into(),
    beneficiary: AccountId32 {
    network: Some(parachain::RelayNetwork::get()),
    id: ALICE.into(),
    }
    .into(),
    },
    ]);

    Alice receives 5 CENTS worth of native assets (Here) and 5 CENTS worth of relay chain derivative assets (Parent).

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-locks.html b/docs/learn/xcm/journey-locks.html index 52157a57d69c..bcbece7e02b5 100644 --- a/docs/learn/xcm/journey-locks.html +++ b/docs/learn/xcm/journey-locks.html @@ -19,7 +19,7 @@ - + @@ -55,7 +55,7 @@ pallet-balances: 10.
    ParaA::execute_with(|| {
    let message = Xcm(vec![
    LockAsset { asset: (Here, 10 * CENTS).into(), unlocker: (Parachain(2)).into() },
    LockAsset { asset: (Here, 5 * CENTS).into(), unlocker: (Parachain(3)).into() },
    ]);
    assert_ok!(ParachainPalletXcm::send_xcm(Here, Parent, message.clone()));
    });

    Relay::execute_with(|| {
    assert_eq!(
    relay_chain::Balances::locks(&parachain_sovereign_account_id(1)),
    vec![BalanceLock { id: *b"py/xcmlk", amount: 10 * CENTS, reasons: Reasons::All }]
    );
    });
    1. Parachain B and C receive the NoteUnlockable instruction.
    ParaB::execute_with(|| {
    assert_eq!(
    parachain::MsgQueue::received_dmp(),
    vec![Xcm(vec![NoteUnlockable {
    owner: (Parent, Parachain(1)).into(),
    asset: (Parent, 10 * CENTS).into()
    }])]
    );
    });

    ParaC::execute_with(|| {
    assert_eq!(
    parachain::MsgQueue::received_dmp(),
    vec![Xcm(vec![NoteUnlockable {
    owner: (Parent, Parachain(1)).into(),
    asset: (Parent, 5 * CENTS).into()
    }])]
    );
    });
    1. Parachain A sends a RequestUnlock instruction to Parachain B for 8 CENTS.
    ParaA::execute_with(|| {
    let message = Xcm(vec![RequestUnlock {
    asset: (Parent, 8 * CENTS).into(),
    locker: Parent.into(),
    }]);

    assert_ok!(ParachainPalletXcm::send_xcm(Here, (Parent, Parachain(2)), message.clone()));
    });
    1. Parachain B Unlocks a part of the funds by sending an UnlockAsset to the relay chain. we check the lock in the balances-pallet. Unlockers: B, C; Funds registered in pallet-xcm: 2, 5. Lock set in pallet-balances: 5.
    Relay::execute_with(|| {
    assert_eq!(
    relay_chain::Balances::locks(&parachain_sovereign_account_id(1)),
    vec![BalanceLock { id: *b"py/xcmlk", amount: 5 * CENTS, reasons: Reasons::All }]
    );
    });
    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-origin.html b/docs/learn/xcm/journey-origin.html index ce0b4cf34cd5..4c925d2786f4 100644 --- a/docs/learn/xcm/journey-origin.html +++ b/docs/learn/xcm/journey-origin.html @@ -19,7 +19,7 @@ - + @@ -47,7 +47,7 @@ for certain values of X (thereby allowing sibling chains to use the same account IDs) or Parachain(X)/ (allowing a Relay-chain to use the account IDs native to its child parachains) or just Parent/ (allowing parachains to use AccountIds of the Relay-chain).

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-queries.html b/docs/learn/xcm/journey-queries.html index 93f94917fdd1..4b502763ad75 100644 --- a/docs/learn/xcm/journey-queries.html +++ b/docs/learn/xcm/journey-queries.html @@ -19,7 +19,7 @@ - + @@ -51,7 +51,7 @@ specified destination.

    ReportTransactStatus(QueryResponseInfo)

    Example

    For the full example, check here. Dispatches a call on the consensus system receiving this Xcm and reports back the status of the Transact Status Register.

    Xcm(vec![
    Transact {
    origin_kind: OriginKind::SovereignAccount,
    require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024),
    call: remark.encode().into(),
    },
    ReportTransactStatus(QueryResponseInfo {
    destination: Parachain(1).into(),
    query_id: QUERY_ID,
    max_weight: Weight::from_all(0),
    }),
    ]);
    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-register.html b/docs/learn/xcm/journey-register.html index 6043dda8680c..d536c9ce751e 100644 --- a/docs/learn/xcm/journey-register.html +++ b/docs/learn/xcm/journey-register.html @@ -19,7 +19,7 @@ - + @@ -33,7 +33,7 @@ and error handler instruction are executed. These instructions are executed regardless of whether an error occurred.

    ClearError

    ClearError

    The ClearError instruction clears the Error Register by setting it to None.

    ClearTransactStatus

    ClearTransactStatus

    The ClearTransactStatus instruction sets the Transact Status Register to its default, cleared, value.

    SetTopic

    SetTopic([u8; 32])

    The SetTopic instruction sets the Topic Register.

    ClearTopic

    ClearTopic

    The ClearTopic instruction clears the Topic Register.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-summary.html b/docs/learn/xcm/journey-summary.html index 00c754bcd8b0..0c16e7ab781a 100644 --- a/docs/learn/xcm/journey-summary.html +++ b/docs/learn/xcm/journey-summary.html @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-transact.html b/docs/learn/xcm/journey-transact.html index d97318c6c85d..fd90d93316be 100644 --- a/docs/learn/xcm/journey-transact.html +++ b/docs/learn/xcm/journey-transact.html @@ -19,7 +19,7 @@ - + @@ -50,7 +50,7 @@ Parachain(1). This function requires the origin to be root. We enable the root origin for the relay chain by setting ParentAsSuperuser for the OriginConverter config type.

    let call = parachain::RuntimeCall::Balances(
    pallet_balances::Call::<parachain::Runtime>::set_balance {
    who: ALICE,
    new_free: 5 * AMOUNT,
    new_reserved: 0,
    },
    );

    let message = Xcm(vec![
    WithdrawAsset((Here, AMOUNT).into()),
    BuyExecution { fees: (Here, AMOUNT).into(), weight_limit: WeightLimit::Unlimited },
    Transact {
    origin_kind: OriginKind::Superuser,
    require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024),
    call: call.encode().into(),
    },
    ]);

    Example 2

    For the full example, check the repo.

    In this example, as Parachain(1), we create an NFT collection on the relay chain and we then mint an NFT with ID 1. The admin for the nft collection is parachain(1). The call looks as follows:

    let create_collection = relay_chain::RuntimeCall::Uniques(
    pallet_uniques::Call::<relay_chain::Runtime>::create {
    collection: 1u32,
    admin: parachain_sovereign_account_id(1),
    }
    );

    The owner of the NFT is Alice. The nft mint call looks as follows:

    let mint = relay_chain::RuntimeCall::Uniques(
    pallet_uniques::Call::<relay_chain::Runtime>::mint {
    collection: 1u32,
    item: 1u32,
    owner: ALICE,
    }
    );

    The xcm message contains the following instructions:

    1. Withdraw native assets from the Parachain(1)'s sovereign account.
    2. Buy weight with these assets.
    3. Create a collection with as admin and owner the sovereign account of Parachain(1).
    4. Mints an NFT in the collection with item ID 1 and as owner Alice.
    let message = Xcm(vec![
    WithdrawAsset((Here, AMOUNT).into()),
    BuyExecution { fees: (Here, AMOUNT).into(), weight_limit: WeightLimit::Unlimited },
    Transact {
    origin_kind: OriginKind::SovereignAccount,
    require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024),
    call: create_collection.encode().into(),
    },
    Transact {
    origin_kind: OriginKind::SovereignAccount,
    require_weight_at_most: Weight::from_parts(INITIAL_BALANCE as u64, 1024 * 1024),
    call: mint.encode().into(),
    },
    ]);

    Next:

    Check out the following instructions that interact with the Transact Status Register:

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey-version.html b/docs/learn/xcm/journey-version.html index a44d9ce383a1..a993800173b5 100644 --- a/docs/learn/xcm/journey-version.html +++ b/docs/learn/xcm/journey-version.html @@ -19,7 +19,7 @@ - + @@ -35,7 +35,7 @@ send back its currently AdvertisedVersion and will keep the subscribed location up to date when the version changes. The subscribed location can unsubscribe to version changes by sending the UnsubscribeVersion instruction.

    SubscribeVersion {
    #[codec(compact)]
    query_id: QueryId,
    max_response_weight: Weight,
    }

    UnsubscribeVersion

    Check out the example.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey.html b/docs/learn/xcm/journey.html index 6b2fa36aecda..a64dee45b2c5 100644 --- a/docs/learn/xcm/journey.html +++ b/docs/learn/xcm/journey.html @@ -19,13 +19,13 @@ - +
    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey/transfers-reserve.html b/docs/learn/xcm/journey/transfers-reserve.html index 1f8c2bbaf600..f9033927223a 100644 --- a/docs/learn/xcm/journey/transfers-reserve.html +++ b/docs/learn/xcm/journey/transfers-reserve.html @@ -19,7 +19,7 @@ - + @@ -73,7 +73,7 @@ It's the sender the one who doesn't need to trust the destination, since it'll ever only be minting derivatives anyway, the sender/reserve controls the real assets and issuance.

    Next steps

    Next, we'll talk about a very important topic we mentioned before but skipped in this chapter, paying fees for the effects our XCMs have.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey/transfers-summary.html b/docs/learn/xcm/journey/transfers-summary.html index d80d4f0b9031..1c9388201fc3 100644 --- a/docs/learn/xcm/journey/transfers-summary.html +++ b/docs/learn/xcm/journey/transfers-summary.html @@ -19,7 +19,7 @@ - + @@ -42,7 +42,7 @@ paying for execution and depositing the rest to another account on the same system. The full example can be seen in the repo.

    Transferring between systems

    But what if you want to make a transfer from one system to another? There are two ways of doing this:

    • Asset teleportation
    • Reserve-backed transfers

    We'll be discussing both in the following chapters.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey/transfers-teleport.html b/docs/learn/xcm/journey/transfers-teleport.html index db21d1abbcea..748d8ecaa6f0 100644 --- a/docs/learn/xcm/journey/transfers-teleport.html +++ b/docs/learn/xcm/journey/transfers-teleport.html @@ -19,7 +19,7 @@ - + @@ -61,7 +61,7 @@ another system. We could do so with the following program:

    let message = Xcm(vec![
    WithdrawAsset((GeneralIndex(1), 42u32).into()),
    InitiateTeleport {
    assets: All.into(),
    dest: Parachain(1).into(),
    xcm: Xcm(vec![DepositAsset {
    assets: All.into(),
    beneficiary: Junction::AccountId32 {
    id: ALICE.into(),
    network: None,
    }.into()
    }]),
    },
    ]);

    Very little changes, in fact, only the MultiAsset we're referencing changes, like we would expect. All the teleportation logic stays the same. The example assumes an NFT with index 42 inside a collection with index 1.

    Next steps

    We'll look at reserve-backed transfers next.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/journey/transfers.html b/docs/learn/xcm/journey/transfers.html index 244ad5335a3b..fbac80964c7b 100644 --- a/docs/learn/xcm/journey/transfers.html +++ b/docs/learn/xcm/journey/transfers.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/overview-architecture.html b/docs/learn/xcm/overview-architecture.html index 5daed24a4ca7..f37b690f4aba 100644 --- a/docs/learn/xcm/overview-architecture.html +++ b/docs/learn/xcm/overview-architecture.html @@ -19,7 +19,7 @@ - + @@ -48,7 +48,7 @@ about later. It's the glue between XCM and FRAME, which is highly used in the Polkadot ecosystem.

    Simulator

    The simulator allows for testing XCMs fast, without needing to boot up several different nodes in a network, or test in production. It's a very useful tool which we'll use throughout this document to build and test different XCMs.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/overview-format.html b/docs/learn/xcm/overview-format.html index eb5f50c434e2..866c6bc3b863 100644 --- a/docs/learn/xcm/overview-format.html +++ b/docs/learn/xcm/overview-format.html @@ -19,7 +19,7 @@ - + @@ -38,7 +38,7 @@ changes. XCM communicates intentions; the actual interpretation and behaviour of each instruction in an XCM is defined by target's XCVM implementation.

    Both simple and more complex scenarios can be expressed, and developers are encouraged to design and implement diverse cross-consensus communication solutions.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/overview-intro.html b/docs/learn/xcm/overview-intro.html index 0f95b6317366..520003d9884d 100644 --- a/docs/learn/xcm/overview-intro.html +++ b/docs/learn/xcm/overview-intro.html @@ -19,7 +19,7 @@ - + @@ -41,7 +41,7 @@ propose changes, which end up in newer versions, the current one being v3. To keep up with the development of the format, or to propose changes, go to the XCM format repository.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/overview-summary.html b/docs/learn/xcm/overview-summary.html index 77ef26a992a6..0c402c1b9d8f 100644 --- a/docs/learn/xcm/overview-summary.html +++ b/docs/learn/xcm/overview-summary.html @@ -19,7 +19,7 @@ - + @@ -32,7 +32,7 @@ interactions between them. XCM is meant to be used by developers to package these interactions into their runtime logic before exposing that functionality to end users.

    This chapter will cover what XCM is, what it isn't, and why it matters before exploring the different components that make up the XCM ecosystem.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/overview-xcvm.html b/docs/learn/xcm/overview-xcvm.html index 60248cb9b77e..602a1c619faa 100644 --- a/docs/learn/xcm/overview-xcvm.html +++ b/docs/learn/xcm/overview-xcvm.html @@ -19,7 +19,7 @@ - + @@ -41,7 +41,7 @@ putting them in and taking them from this register. This register is used by several of the instructions we will look at later, including DepositAsset and WithdrawAsset.

    For more information on other registers, see the All XCVM Registers section.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/overview.html b/docs/learn/xcm/overview.html index 7627f505c3a1..74b7b4d74cde 100644 --- a/docs/learn/xcm/overview.html +++ b/docs/learn/xcm/overview.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/quickstart-first-look.html b/docs/learn/xcm/quickstart-first-look.html index 8786e5af60ce..8a96ace9dfdb 100644 --- a/docs/learn/xcm/quickstart-first-look.html +++ b/docs/learn/xcm/quickstart-first-look.html @@ -19,7 +19,7 @@ - + @@ -51,7 +51,7 @@ examples for every instruction in the journey through XCM chapter. First, it's important to learn the fundamentals, MultiLocation, MultiAsset, and other concepts in XCM. We'll talk about those next.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/quickstart-simulator.html b/docs/learn/xcm/quickstart-simulator.html index dd9d3e29c9b5..e37e06657165 100644 --- a/docs/learn/xcm/quickstart-simulator.html +++ b/docs/learn/xcm/quickstart-simulator.html @@ -19,7 +19,7 @@ - + @@ -31,7 +31,7 @@ actually test your XCM-powered solution. We'll get into tools and best practices for testing in the testing chapter.

    We'll use the simulator throughout the documentation to show different XCMs in action. In the next section we will take a first look at an XCM.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/quickstart-summary.html b/docs/learn/xcm/quickstart-summary.html index 05b3ed8cbc05..0265de088398 100644 --- a/docs/learn/xcm/quickstart-summary.html +++ b/docs/learn/xcm/quickstart-summary.html @@ -19,7 +19,7 @@ - + @@ -29,7 +29,7 @@ installation guide.

    Running the Examples

    All examples in the documentation are located in the repository. Follow these steps to run the first-look example. First clone the repository:

    git clone git@github.com:paritytech/xcm-docs.git
    cd xcm-docs/examples

    To run the first-look example, run the following line:

    cargo test -p xcm-examples para_a_simple_transfer -- --nocapture

    It should show you the following output:

    running 1 test
    test first_look::tests::para_a_simple_transfer ... ok

    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.01s
    - + \ No newline at end of file diff --git a/docs/learn/xcm/quickstart.html b/docs/learn/xcm/quickstart.html index 0b9e34a0d353..ead01a681fbc 100644 --- a/docs/learn/xcm/quickstart.html +++ b/docs/learn/xcm/quickstart.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/reference-glossary.html b/docs/learn/xcm/reference-glossary.html index cd2b1b5c552f..6e81c0836dbf 100644 --- a/docs/learn/xcm/reference-glossary.html +++ b/docs/learn/xcm/reference-glossary.html @@ -19,7 +19,7 @@ - + @@ -44,7 +44,7 @@ through the relay chain.

    HRMP (Horizontal Message Passing)

    Transport-layer protocol that allows a parachain to send messages to a sibling parachain going through the relay chain. It's a precursor to XCMP, also known as XCMP-lite. It uses a mixture of UMP and VMP.

    - + \ No newline at end of file diff --git a/docs/learn/xcm/reference-xcvm-registers.html b/docs/learn/xcm/reference-xcvm-registers.html index 80f273294375..b37b6b0b1d80 100644 --- a/docs/learn/xcm/reference-xcvm-registers.html +++ b/docs/learn/xcm/reference-xcvm-registers.html @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@
    - + \ No newline at end of file diff --git a/docs/learn/xcm/references.html b/docs/learn/xcm/references.html index 2af12cc91562..4f417d257c94 100644 --- a/docs/learn/xcm/references.html +++ b/docs/learn/xcm/references.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/learn/xcm/testing.html b/docs/learn/xcm/testing.html index 08e8719144b7..849756ff021c 100644 --- a/docs/learn/xcm/testing.html +++ b/docs/learn/xcm/testing.html @@ -19,7 +19,7 @@ - + @@ -39,7 +39,7 @@ messaging infrastructure as live networks, as the transport mechanism is being mocked out. Also, consensus related events are not tested, like disputes, staking and iamonline events. To test for these events, parachains can use E2E tests.

    End-to-End testing

    There are two frameworks being used in the ecosystem to do e2e testing:

    - + \ No newline at end of file diff --git a/docs/ledger.html b/docs/ledger.html index a784b890ff5b..53fd9a83adfc 100644 --- a/docs/ledger.html +++ b/docs/ledger.html @@ -19,7 +19,7 @@ - + @@ -141,7 +141,7 @@ device after the installation.
  • If you wish to revert the version to the stable release, go to Ledger Live. The app will automatically detect the developer release and give the option to install the previous stable release.
  • - + \ No newline at end of file diff --git a/docs/maintain-bootnode.html b/docs/maintain-bootnode.html index ee6b966a198a..a512f5115db7 100644 --- a/docs/maintain-bootnode.html +++ b/docs/maintain-bootnode.html @@ -19,7 +19,7 @@ - + @@ -41,7 +41,7 @@ port 30311:

    /etc/nginx/sites-enabled/dot-bootnode

    server {
    listen 30312 ssl http2 default_server;
    server_name dot-bootnode.stakeworld.io;
    root /var/www/html;

    ssl_certificate "<your_cert";
    ssl_certificate_key "<your_key>";

    location / {
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_pass http://localhost:30311;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
    }

    }

    Testing Bootnode Connection

    If we have the above node running with DNS name dot-bootnode.stakeworld.io, proxied with a valid certificate and node-id 12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg then the following commands should give you a: "syncing 1 peers".

    tip

    You can add -lsub-libp2p=trace on the end to get libp2p trace logging for debugging purposes.

    p2p:

    polkadot --chain polkadot --base-path /tmp/node --name "Bootnode testnode" --reserved-only --reserved-nodes "/dns/dot-bootnode.stakeworld.io/tcp/30310/p2p/12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg" --no-hardware-benchmarks

    p2p/ws:

    polkadot --chain polkadot --base-path /tmp/node --name "Bootnode testnode" --reserved-only --reserved-nodes "/dns/dot-bootnode.stakeworld.io/tcp/30311/ws/p2p/12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg" --no-hardware-benchmarks

    p2p/wss:

    polkadot --chain polkadot --base-path /tmp/node --name "Bootnode testnode" --reserved-only --reserved-nodes "/dns/dot-bootnode.stakeworld.io/tcp/30312/wss/p2p/12D3KooWAb5MyC1UJiEQJk4Hg4B2Vi3AJdqSUhTGYUqSnEqCFMFg" --no-hardware-benchmarks
    - + \ No newline at end of file diff --git a/docs/maintain-endpoints.html b/docs/maintain-endpoints.html index 40d137721b9a..8c1dcbdff0e7 100644 --- a/docs/maintain-endpoints.html +++ b/docs/maintain-endpoints.html @@ -19,7 +19,7 @@ - + @@ -40,7 +40,7 @@ provide additional services such as higher rate limits, potentially more reliable and scalable service, and additional metrics.

    note

    The list of third party RPC endpoints above for Polkadot and Kusama is directly fetched from Polkdot-JS UI

    - + \ No newline at end of file diff --git a/docs/maintain-errors.html b/docs/maintain-errors.html index 38270e89c390..7517c9cca6f2 100644 --- a/docs/maintain-errors.html +++ b/docs/maintain-errors.html @@ -19,7 +19,7 @@ - + @@ -50,7 +50,7 @@ will wait to be executed at the correct place in the nonce sequence OR it will get discarded due to some other error (ex. the validity period expires).*

    Error Table

    The below table is a reference to the errors that exists in Polkadot. It is generated from the runtime's metadata.

    PalletErrorDocumentation
    System (0)
    InvalidSpecName (0)The name of specification does not match between the current runtime and the new runtime.
    SpecVersionNeedsToIncrease (1)The specification version is not allowed to decrease between the current runtime and the new runtime.
    FailedToExtractRuntimeVersion (2)Failed to extract the runtime version from the new runtime. Either calling Core_version or decoding RuntimeVersion failed.
    NonDefaultComposite (3)Suicide called when the account has non-default composite data.
    NonZeroRefCount (4)There is a non-zero reference count preventing the account from being purged.
    Scheduler (1)
    FailedToSchedule (0)Failed to schedule a call
    NotFound (1)Cannot find the scheduled call.
    TargetBlockNumberInPast (2)Given target block number is in the past.
    RescheduleNoChange (3)Reschedule failed because it does not change scheduled time.
    Balances (5)
    VestingBalance (0)Vesting balance too high to send value
    LiquidityRestrictions (1)Account liquidity restrictions prevent withdrawal
    Overflow (2)Got an overflow after adding
    InsufficientBalance (3)Balance too low to send value
    ExistentialDeposit (4)Value too low to create account due to existential deposit
    KeepAlive (5)Transfer/payment would kill account
    ExistingVestingSchedule (6)A vesting schedule already exists for this account
    DeadAccount (7)Beneficiary account must pre-exist
    Authorship (6)
    InvalidUncleParent (0)The uncle parent not in the chain.
    UnclesAlreadySet (1)Uncles already set in the block.
    TooManyUncles (2)Too many uncles.
    GenesisUncle (3)The uncle is genesis.
    TooHighUncle (4)The uncle is too high in chain.
    UncleAlreadyIncluded (5)The uncle is already included.
    OldUncle (6)The uncle isn't recent enough to be included.
    Staking (7)
    NotController (0)Not a controller account.
    NotStash (1)Not a stash account.
    AlreadyBonded (2)Stash is already bonded.
    AlreadyPaired (3)Controller is already paired.
    EmptyTargets (4)Targets cannot be empty.
    DuplicateIndex (5)Duplicate index.
    InvalidSlashIndex (6)Slash record index out of bounds.
    InsufficientValue (7)Can not bond with value less than minimum balance.
    NoMoreChunks (8)Can not schedule more unlock chunks.
    NoUnlockChunk (9)Can not rebond without unlocking chunks.
    FundedTarget (10)Attempting to target a stash that still has funds.
    InvalidEraToReward (11)Invalid era to reward.
    InvalidNumberOfNominations (12)Invalid number of nominations.
    NotSortedAndUnique (13)Items are not sorted and unique.
    AlreadyClaimed (14)Rewards for this era have already been claimed for this validator.
    OffchainElectionEarlySubmission (15)The submitted result is received out of the open window.
    OffchainElectionWeakSubmission (16)The submitted result is not as good as the one stored on chain.
    SnapshotUnavailable (17)The snapshot data of the current window is missing.
    OffchainElectionBogusWinnerCount (18)Incorrect number of winners were presented.
    OffchainElectionBogusWinner (19)One of the submitted winners is not an active candidate on chain (index is out of range in snapshot).
    OffchainElectionBogusCompact (20)Error while building the assignment type from the compact. This can happen if an index is invalid, or if the weights overflow.
    OffchainElectionBogusNominator (21)One of the submitted nominators is not an active nominator on chain.
    OffchainElectionBogusNomination (22)One of the submitted nominators has an edge to which they have not voted on chain.
    OffchainElectionSlashedNomination (23)One of the submitted nominators has an edge which is submitted before the last non-zero slash of the target.
    OffchainElectionBogusSelfVote (24)A self vote must only be originated from a validator to ONLY themselves.
    OffchainElectionBogusEdge (25)The submitted result has unknown edges that are not among the presented winners.
    OffchainElectionBogusScore (26)The claimed score does not match with the one computed from the data.
    OffchainElectionBogusElectionSize (27)The election size is invalid.
    CallNotAllowed (28)The call is not allowed at the given time due to restrictions of election period.
    IncorrectHistoryDepth (29)Incorrect previous history depth input provided.
    IncorrectSlashingSpans (30)Incorrect number of slashing spans provided.
    Session (9)
    InvalidProof (0)Invalid ownership proof.
    NoAssociatedValidatorId (1)No associated validator ID for account.
    DuplicatedKey (2)Registered duplicate key.
    NoKeys (3)No keys are associated with this account.
    Grandpa (11)
    PauseFailed (0)Attempt to signal GRANDPA pause when the authority set isn't live (either paused or already pending pause).
    ResumeFailed (1)Attempt to signal GRANDPA resume when the authority set isn't paused (either live or already pending resume).
    ChangePending (2)Attempt to signal GRANDPA change with one already pending.
    TooSoon (3)Cannot signal forced change so soon after last.
    InvalidKeyOwnershipProof (4)A key ownership proof provided as part of an equivocation report is invalid.
    InvalidEquivocationProof (5)An equivocation proof provided as part of an equivocation report is invalid.
    DuplicateOffenceReport (6)A given equivocation report is valid but already previously reported.
    ImOnline (12)
    InvalidKey (0)Non existent public key.
    DuplicatedHeartbeat (1)Duplicated heartbeat.
    Democracy (14)
    ValueLow (0)Value too low
    ProposalMissing (1)Proposal does not exist
    BadIndex (2)Unknown index
    AlreadyCanceled (3)Cannot cancel the same proposal twice
    DuplicateProposal (4)Proposal already made
    ProposalBlacklisted (5)Proposal still blacklisted
    NotSimpleMajority (6)Next external proposal not simple majority
    InvalidHash (7)Invalid hash
    NoProposal (8)No external proposal
    AlreadyVetoed (9)Identity may not veto a proposal twice
    NotDelegated (10)Not delegated
    DuplicatePreimage (11)Preimage already noted
    NotImminent (12)Not imminent
    TooEarly (13)Too early
    Imminent (14)Imminent
    PreimageMissing (15)Preimage not found
    ReferendumInvalid (16)Vote given for invalid referendum
    PreimageInvalid (17)Invalid preimage
    NoneWaiting (18)No proposals waiting
    NotLocked (19)The target account does not have a lock.
    NotExpired (20)The lock on the account to be unlocked has not yet expired.
    NotVoter (21)The given account did not vote on the referendum.
    NoPermission (22)The actor has no permission to conduct the action.
    AlreadyDelegating (23)The account is already delegating.
    Overflow (24)An unexpected integer overflow occurred.
    Underflow (25)An unexpected integer underflow occurred.
    InsufficientFunds (26)Too high a balance was provided that the account cannot afford.
    NotDelegating (27)The account is not currently delegating.
    VotesExist (28)The account currently has votes attached to it and the operation cannot succeed until these are removed, either through unvote or reap_vote.
    InstantNotAllowed (29)The instant referendum origin is currently disallowed.
    Nonsense (30)Delegation to oneself makes no sense.
    WrongUpperBound (31)Invalid upper bound.
    MaxVotesReached (32)Maximum number of votes reached.
    InvalidWitness (33)The provided witness data is wrong.
    TooManyProposals (34)Maximum number of proposals reached.
    Council (15)
    NotMember (0)Account is not a member
    DuplicateProposal (1)Duplicate proposals not allowed
    ProposalMissing (2)Proposal must exist
    WrongIndex (3)Mismatched index
    DuplicateVote (4)Duplicate vote ignored
    AlreadyInitialized (5)Members are already initialized!
    TooEarly (6)The close call was made too early, before the end of the voting.
    TooManyProposals (7)There can only be a maximum of MaxProposals active proposals.
    WrongProposalWeight (8)The given weight bound for the proposal was too low.
    WrongProposalLength (9)The given length bound for the proposal was too low.
    TechnicalCommittee (16)
    NotMember (0)Account is not a member
    DuplicateProposal (1)Duplicate proposals not allowed
    ProposalMissing (2)Proposal must exist
    WrongIndex (3)Mismatched index
    DuplicateVote (4)Duplicate vote ignored
    AlreadyInitialized (5)Members are already initialized!
    TooEarly (6)The close call was made too early, before the end of the voting.
    TooManyProposals (7)There can only be a maximum of MaxProposals active proposals.
    WrongProposalWeight (8)The given weight bound for the proposal was too low.
    WrongProposalLength (9)The given length bound for the proposal was too low.
    ElectionsPhragmen (17)
    UnableToVote (0)Cannot vote when no candidates or members exist.
    NoVotes (1)Must vote for at least one candidate.
    TooManyVotes (2)Cannot vote more than candidates.
    MaximumVotesExceeded (3)Cannot vote more than maximum allowed.
    LowBalance (4)Cannot vote with stake less than minimum balance.
    UnableToPayBond (5)Voter can not pay voting bond.
    MustBeVoter (6)Must be a voter.
    ReportSelf (7)Cannot report self.
    DuplicatedCandidate (8)Duplicated candidate submission.
    MemberSubmit (9)Member cannot re-submit candidacy.
    RunnerSubmit (10)Runner cannot re-submit candidacy.
    InsufficientCandidateFunds (11)Candidate does not have enough funds.
    NotMember (12)Not a member.
    InvalidCandidateCount (13)The provided count of number of candidates is incorrect.
    InvalidVoteCount (14)The provided count of number of votes is incorrect.
    InvalidRenouncing (15)The renouncing origin presented a wrong Renouncing parameter.
    InvalidReplacement (16)Prediction regarding replacement after member removal is wrong.
    Treasury (19)
    InsufficientProposersBalance (0)Proposer's balance is too low.
    InvalidIndex (1)No proposal or bounty at that index.
    ReasonTooBig (2)The reason given is just too big.
    AlreadyKnown (3)The tip was already found/started.
    UnknownTip (4)The tip hash is unknown.
    NotFinder (5)The account attempting to retract the tip is not the finder of the tip.
    StillOpen (6)The tip cannot be claimed/closed because there are not enough tippers yet.
    Premature (7)The tip cannot be claimed/closed because it's still in the countdown period.
    UnexpectedStatus (8)The bounty status is unexpected.
    RequireCurator (9)Require bounty curator.
    InvalidValue (10)Invalid bounty value.
    InvalidFee (11)Invalid bounty fee.
    PendingPayout (12)A bounty payout is pending. To cancel the bounty, you must unassign and slash the curator.
    Claims (24)
    InvalidEthereumSignature (0)Invalid Ethereum signature.
    SignerHasNoClaim (1)Ethereum address has no claim.
    SenderHasNoClaim (2)Account ID sending tx has no claim.
    PotUnderflow (3)There's not enough in the pot to pay out some unvested amount. Generally implies a logic error.
    InvalidStatement (4)A needed statement was not included.
    VestedBalanceExists (5)The account already has a vested balance.
    Vesting (25)
    NotVesting (0)The account given is not vesting.
    ExistingVestingSchedule (1)An existing vesting schedule already exists for this account that cannot be clobbered.
    AmountLow (2)Amount being transferred is too low to create a vesting schedule.
    Identity (28)
    TooManySubAccounts (0)Too many subs-accounts.
    NotFound (1)Account isn't found.
    NotNamed (2)Account isn't named.
    EmptyIndex (3)Empty index.
    FeeChanged (4)Fee is changed.
    NoIdentity (5)No identity found.
    StickyJudgement (6)Sticky judgement.
    JudgementGiven (7)Judgement given.
    InvalidJudgement (8)Invalid judgement.
    InvalidIndex (9)The index is invalid.
    InvalidTarget (10)The target is invalid.
    TooManyFields (11)Too many additional fields.
    TooManyRegistrars (12)Maximum amount of registrars reached. Cannot add any more.
    AlreadyClaimed (13)Account ID is already named.
    NotSub (14)Sender is not a sub-account.
    NotOwned (15)Sub-account isn't owned by sender.
    Proxy (29)
    TooMany (0)There are too many proxies registered or too many announcements pending.
    NotFound (1)Proxy registration not found.
    NotProxy (2)Sender is not a proxy of the account to be proxied.
    Unproxyable (3)A call which is incompatible with the proxy type's filter was attempted.
    Duplicate (4)Account is already a proxy.
    NoPermission (5)Call may not be made by proxy because it may escalate its privileges.
    Unannounced (6)Announcement, if made at all, was made too recently.
    Multisig (30)
    MinimumThreshold (0)Threshold must be 2 or greater.
    AlreadyApproved (1)Call is already approved by this signatory.
    NoApprovalsNeeded (2)Call doesn't need any (more) approvals.
    TooFewSignatories (3)There are too few signatories in the list.
    TooManySignatories (4)There are too many signatories in the list.
    SignatoriesOutOfOrder (5)The signatories were provided out of order; they should be ordered.
    SenderInSignatories (6)The sender was contained in the other signatories; it shouldn't be.
    NotFound (7)Multisig operation not found when attempting to cancel.
    NotOwner (8)Only the account that originally created the multisig is able to cancel it.
    NoTimepoint (9)No timepoint was given, yet the multisig operation is already underway.
    WrongTimepoint (10)A different timepoint was given to the multisig operation that is underway.
    UnexpectedTimepoint (11)A timepoint was given, yet no multisig operation is underway.
    WeightTooLow (12)The maximum weight information provided was too low.
    AlreadyStored (13)The data to be stored is already stored.
    - + \ No newline at end of file diff --git a/docs/maintain-guides-avoid-slashing.html b/docs/maintain-guides-avoid-slashing.html index 55d7a3b5aaa1..380127fc796f 100644 --- a/docs/maintain-guides-avoid-slashing.html +++ b/docs/maintain-guides-avoid-slashing.html @@ -19,7 +19,7 @@ - + @@ -68,7 +68,7 @@ obtain pristine binaries or source code and to ensure the security of their node:

    1. Always download either source files or binaries from the official Parity repository
    2. Verify the hash of downloaded files.
    3. Use the W3F secure validator setup or adhere to its principles
    4. Ensure essential security items are checked, use a firewall, manage user access, use SSH certificates
    5. Avoid using your server as a general-purpose system. Hosting a validator on your workstation or one that hosts other services increases the risk of maleficence.

    Examples

    NetworkEraEvent TypeDetailsAction Taken
    Polkadot774Small EquivocationThe validator migrated servers and cloned the keystore folder. The on-chain event can be viewed here.The validator did not submit a request for the slash to be canceled.
    Kusama3329Small EquivocationThe validator operated a test machine with cloned keys; the test machine was online at the same time as the primary, which resulted in a slash. Details can be found here.The validator requested a cancellation of the slash, but the council declined.
    Kusama3995Small EquivocationThe validator noticed several errors, after which the client crashed, and a slash was applied. The validator recorded all events and opened GitHub issues to allow for technical opinions to be shared. Details can be found here.The validator requested to cancel the slash. The council approved the request as they believed the error was not operator related.
    Kusama4543Medium UnresponsivenessA large amount of disputes flooded the network resulting in an application fault. The fault caused the client software to hang and as a result ~197 unique validators become unresponsive. Further details can be found here.The pending slash was cancelled and with runtime 9350 all lost nominations were restored. The application bug was addressed with client version 0.9.36
    - + \ No newline at end of file diff --git a/docs/maintain-guides-democracy.html b/docs/maintain-guides-democracy.html index 04ecafa2a7bf..aeff25925e7e 100644 --- a/docs/maintain-guides-democracy.html +++ b/docs/maintain-guides-democracy.html @@ -19,7 +19,7 @@ - + @@ -162,7 +162,7 @@ a decimal integer. The bitfield stores both the conviction and aye/nay boolean, where the boolean is represented using the MSB of the byte. This would mean that the grouping of the 7 remaining bits is used to store the conviction.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-chill.html b/docs/maintain-guides-how-to-chill.html index cd65a8bee259..a1642f2fad78 100644 --- a/docs/maintain-guides-how-to-chill.html +++ b/docs/maintain-guides-how-to-chill.html @@ -19,7 +19,7 @@ - + @@ -79,7 +79,7 @@ Polkadot is set to None eliminating the upper bound on the number of nominators on the network. Due to this, the chillOther extrinsic on Polkadot network has no effect as the chill threshold will never be met.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-join-council.html b/docs/maintain-guides-how-to-join-council.html index 82747cb508b5..192b9bbca105 100644 --- a/docs/maintain-guides-how-to-join-council.html +++ b/docs/maintain-guides-how-to-join-council.html @@ -19,7 +19,7 @@ - + @@ -43,7 +43,7 @@ the row "Members".

    council members list

    Now you are able to participate on the council by making motions or voting proposals. To join in on the active discussions, join the Polkadot Direction channel.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-monitor-your-node.html b/docs/maintain-guides-how-to-monitor-your-node.html index bd886bf531da..f0ffa53984d9 100644 --- a/docs/maintain-guides-how-to-monitor-your-node.html +++ b/docs/maintain-guides-how-to-monitor-your-node.html @@ -19,7 +19,7 @@ - + @@ -83,7 +83,7 @@ here. There are other interesting alerts you may find useful here.

    groups:
    - name: alert_rules
    rules:
    - alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
    severity: critical
    annotations:
    summary: "Instance [{{ $labels.instance }}] down"
    description: "[{{ $labels.instance }}] of job [{{ $labels.job }}] has been down for more than 1 minute."

    Change the ownership of this file to prometheus instead of root by running:

    sudo chown prometheus:prometheus rules.yml

    To check the rules defined in the "rules.yml" is syntactically correct, run the following command:

    sudo -u prometheus promtool check rules rules.yml

    Finally, restart everything by running:

    sudo systemctl restart prometheus && sudo systemctl restart alertmanager

    Now if one of your target instances down, you will receive an alert on the AlertManager and Gmail like below.

    grafana-am-6

    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-nominate-kusama.html b/docs/maintain-guides-how-to-nominate-kusama.html index 69b7a8f6e658..7b578447b0c0 100644 --- a/docs/maintain-guides-how-to-nominate-kusama.html +++ b/docs/maintain-guides-how-to-nominate-kusama.html @@ -19,7 +19,7 @@ - + @@ -96,7 +96,7 @@ Polkascan. Also, you can verify the bonding state under the Staking page on the Polkadot-JS Apps Dashboard.

    Step 3. Nominate a validator

    To nominate a validator, you can execute the following command:

    polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.nominate '["VALIDATOR_ADDRESS"]' --ws WS_ENDPOINT
    polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.nominate '["CmD9vaMYoiKe7HiFnfkftwvhKbxN9bhyjcDrfFRGbifJEG8","E457XaKbj2yTB2URy8N4UuzmyuFRkcdxYs67UvSgVr7HyFb"]' --ws wss://kusama-rpc.polkadot.io/

    After a few seconds, you should see the hash of the transaction and if you would like to verify the nomination status, you can check that on the Polkadot-JS UI as well.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-nominate-polkadot.html b/docs/maintain-guides-how-to-nominate-polkadot.html index ef672ba2ca4e..e0c00f6c3e6b 100644 --- a/docs/maintain-guides-how-to-nominate-polkadot.html +++ b/docs/maintain-guides-how-to-nominate-polkadot.html @@ -19,7 +19,7 @@ - + @@ -67,7 +67,7 @@ Polkascan. Also, you can verify the bonding state under the Staking page on the Polkadot-JS Apps Dashboard.

    Step 3. Nominate a validator

    To nominate a validator, you can execute the following command:

    polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.nominate '["VALIDATOR_ADDRESS"]' --ws WS_ENDPOINT
    polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.nominate '["CmD9vaMYoiKe7HiFnfkftwvhKbxN9bhyjcDrfFRGbifJEG8","E457XaKbj2yTB2URy8N4UuzmyuFRkcdxYs67UvSgVr7HyFb"]' --ws wss://rpc.polkadot.io

    After a few seconds, you should see the hash of the transaction, and if you would like to verify the nomination status, you can check that on the Polkadot-JS UI as well.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-stop-validating.html b/docs/maintain-guides-how-to-stop-validating.html index 2fad444dba76..3c488728a1d3 100644 --- a/docs/maintain-guides-how-to-stop-validating.html +++ b/docs/maintain-guides-how-to-stop-validating.html @@ -19,7 +19,7 @@ - + @@ -40,7 +40,7 @@ transfer your tokens.

    See Unbonding and Rebonding for more details.

    Unbond your tokens

    Unbonding your tokens can be done through the Network > Staking > Account actions page in PolkadotJS Apps by clicking the corresponding stash account dropdown and selecting "Unbond funds". This can also be done through the staking.unbond() extrinsic with the staking proxy account.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-systemd.html b/docs/maintain-guides-how-to-systemd.html index f238850c072e..6d77ef7a9141 100644 --- a/docs/maintain-guides-how-to-systemd.html +++ b/docs/maintain-guides-how-to-systemd.html @@ -19,7 +19,7 @@ - + @@ -32,7 +32,7 @@ not recognize votes that didn't make it to disk, and will then cast conflicting votes. Delaying the restart will allow the network to progress past potentially conflicting votes, at which point other nodes will not accept them.

    To enable this to autostart on bootup run:

    systemctl enable polkadot-validator.service

    Start it manually with:

    systemctl start polkadot-validator.service

    You can check that it's working with:

    systemctl status polkadot-validator.service

    You can tail the logs with journalctl like so:

    journalctl -f -u polkadot-validator
    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-upgrade.html b/docs/maintain-guides-how-to-upgrade.html index 5906b006b71c..f9fb7273bb1d 100644 --- a/docs/maintain-guides-how-to-upgrade.html +++ b/docs/maintain-guides-how-to-upgrade.html @@ -19,7 +19,7 @@ - + @@ -50,7 +50,7 @@ Validator A.
  • Take note of the Session that this extrinsic was executed in.
  • Again, it is imperative that Validator B is kept running until the current session finishes and two further full sessions have elapsed.

    Once this time has elapsed, Validator A will take over. You can safely stop Validator B.

    NOTE: To verify that the Session has changed, make sure that a block in the new Session is finalized. You should see log messages like the ones below to confirm the change:

    2019-10-28 21:44:13 Applying authority set change scheduled at block #450092
    2019-10-28 21:44:13 Applying GRANDPA set change to new set with 20 authorities
    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-validate-kusama.html b/docs/maintain-guides-how-to-validate-kusama.html index 12d6895992c0..a5cb5d9f70ca 100644 --- a/docs/maintain-guides-how-to-validate-kusama.html +++ b/docs/maintain-guides-how-to-validate-kusama.html @@ -19,7 +19,7 @@ - + @@ -68,7 +68,7 @@ validator payout document.

    Run a Kusama Validator

    Running a validator on the Kusama network is identical to running a Polkadot validator. Check out the Polkadot guide on how to setup a validator.

    Make sure to adjust the Polkadot guide to run a Kusama network validator (the instructions will also be available in the Polkadot Validator guide):

    • When starting the node pass --chain=kusama CLI flag
    - + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-validate-polkadot.html b/docs/maintain-guides-how-to-validate-polkadot.html index 53b2906def77..43456f3f0a9c 100644 --- a/docs/maintain-guides-how-to-validate-polkadot.html +++ b/docs/maintain-guides-how-to-validate-polkadot.html @@ -19,7 +19,7 @@ - + @@ -92,9 +92,9 @@ additional needed binaries, polkadot-prepare-worker, and polkadot-execute-worker. All three binaries are needed to properly run a validator node. More context on these changes can be found here

    Installation from official releases

    The official binaries can be downloaded from the -Github Releases. You should download the latest -available version. You can also download the binaries by using the following direct links (replace -X.Y.Z by the appropriate version):

    https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot
    https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-execute-worker
    https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-prepare-worker

    Optional: Installation with Package Managers

    The Polkadot Binary in included in Debian derivatives (i.e. Debian, Ubuntu) and +Github Releases. You should download the +latest available version. You can also download the binaries by using the following direct links +(replace X.Y.Z by the appropriate version):

    https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot
    https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-execute-worker
    https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-prepare-worker

    Optional: Installation with Package Managers

    The Polkadot Binary in included in Debian derivatives (i.e. Debian, Ubuntu) and RPM-based distros (i.e. Fedora, CentOS).

    Debian-based (Debian, Ubuntu)

    Run the following commands as the root user:

    # Import the security@parity.io GPG key
    gpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798
    gpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg
    # Add the Parity repository and update the package index
    echo 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list
    apt update
    # Install the `parity-keyring` package - This will ensure the GPG key
    # used by APT remains up-to-date
    apt install parity-keyring
    # Install polkadot
    apt install polkadot

    RPM-based (Fedora, CentOS)

    Run the following commands as the root user:

    # Install dnf-plugins-core (This might already be installed)
    dnf install dnf-plugins-core
    # Add the repository and enable it
    dnf config-manager --add-repo https://releases.parity.io/rpm/polkadot.repo
    dnf config-manager --set-enabled polkadot
    # Install polkadot (You may have to confirm the import of the GPG key, which
    # should have the following fingerprint: 9D4B2B6EB8F97156D19669A9FF0812D491B96798)
    dnf install polkadot

    Make sure you verify the installation (see the "Verify the installation" section).

    By default, the Polkadot systemd service is disabled

    To start the service, run:

    sudo systemctl start polkadot.service

    Optional: Installation with Ansible

    To manage Polkadot installation with Ansible, you can use the Substrate node role distributed on the Parity chain operations Ansible collection

    Optional: Installation with Docker

    To run Polkadot on a Docker or an OCI compatible container runtime, you can use the official parity/polkadot docker image, available on Docker @@ -258,8 +258,8 @@ trusted code on the host.

    VPS List

    Beware of the Terms and Conditions and Acceptable Use Policies for each VPS

    provider

    You may be locked out of your account and your server shut down if you come in violation. For instance, Digital Ocean lists "Mining of Cryptocurrencies" under the Network Abuse section of their Acceptable Use Policy and requires -explicit permission to do so. This may extend to other cryptocurrency activity.

    - +explicit permission to do so. This may extend to other cryptocurrency activity.

    + \ No newline at end of file diff --git a/docs/maintain-guides-how-to-vote-councillor.html b/docs/maintain-guides-how-to-vote-councillor.html index 5b03b4876dc9..05bc1e356c9d 100644 --- a/docs/maintain-guides-how-to-vote-councillor.html +++ b/docs/maintain-guides-how-to-vote-councillor.html @@ -19,7 +19,7 @@ - + @@ -47,7 +47,7 @@ Polkadot-JS Apps Dashboard.

    Under the "Council overview" tab, click on "Vote".

    polkadotjs_removeVoter

    Issue the "Unvote all" option.

    When the transaction is included in a block you should have your reserved tokens made liquid again and your vote will no longer be counting for any councillors in the elections starting in the next term.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-polkadot-opengov.html b/docs/maintain-guides-polkadot-opengov.html index efc43e0b780c..61fb0f25ec0c 100644 --- a/docs/maintain-guides-polkadot-opengov.html +++ b/docs/maintain-guides-polkadot-opengov.html @@ -19,7 +19,7 @@ - + @@ -144,7 +144,7 @@ If you like to use Polkadot-JS UI for performing multi-role delegation, the instructions are available here.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-secure-validator.html b/docs/maintain-guides-secure-validator.html index ddfd88fda928..c96a89227474 100644 --- a/docs/maintain-guides-secure-validator.html +++ b/docs/maintain-guides-secure-validator.html @@ -19,7 +19,7 @@ - + @@ -65,7 +65,7 @@ hardware. The provisioning of the validator machine should be automated and defined in code. This code should be kept in private version control, reviewed, audited, and tested.

  • Session keys should be generated and provided in a secure way.

  • Polkadot should be started at boot and restarted if stopped for any reason (supervisor process).

  • Polkadot should run as a non-root user.

  • Monitoring

    • There should be an on-call rotation for managing the alerts.

    • There should be a clear protocol with actions to perform for each level of each alert and an escalation policy.

    Resources

    - + \ No newline at end of file diff --git a/docs/maintain-guides-society-kusama.html b/docs/maintain-guides-society-kusama.html index 7e16480ee28b..e53baad2ad50 100644 --- a/docs/maintain-guides-society-kusama.html +++ b/docs/maintain-guides-society-kusama.html @@ -19,7 +19,7 @@ - + @@ -93,7 +93,7 @@ extrinsic's parameters go to Element 1 ("proposal") -> "value" -> "params" -> Element 2 ("rules") and copy the value corresponding to the key "value". You can use a hex-to-UTF8 converter to then display the text. Note that the text is formatted with Markdown.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-validator-community.html b/docs/maintain-guides-validator-community.html index 84d4de1ce19e..1786669d569a 100644 --- a/docs/maintain-guides-validator-community.html +++ b/docs/maintain-guides-validator-community.html @@ -19,7 +19,7 @@ - + @@ -163,7 +163,7 @@ monitoring, observability services, staking dashboards, wallets, command-line utilities, or porting implementations to other languages. Additionally, this may also be eligible to be funded via a Web3 Foundation Grant.

    - + \ No newline at end of file diff --git a/docs/maintain-guides-validator-payout.html b/docs/maintain-guides-validator-payout.html index b23408c7f342..2c12f9e4f463 100644 --- a/docs/maintain-guides-validator-payout.html +++ b/docs/maintain-guides-validator-payout.html @@ -19,7 +19,7 @@ - + @@ -109,7 +109,7 @@ brackets ([]) next to each validator. Note that since the validator payment is public knowledge, having a low or non-existent validator payment may attract more stake from nominators, since they know they will receive a larger reward.

    Validator Set Size (v): 4
    Validator 1 Stake (v1) [20% commission]: 18 DOT (9 validator, 9 nominator)
    Validator 2 Stake (v2) [40% commission]: 9 DOT (3 validator, 6 nominator)
    Validator 3 Stake (v3) [10% commission]: 8 DOT (4 validator, 4 nominator)
    Validator 4 Stake (v4) [ 0% commission]: 6 DOT (1 validator, 5 nominator)
    Payout (p): 8 DOT

    Payout for each validator (v1 - v4):
    p / v = 8 / 4 = 2 DOT

    v1:
    (0.2 * 2) = 0.4 DOT -> validator payment
    (2 - 0.4) = 1.6 -> shared between all stake
    (9 / 18) * 1.6 = 0.8 -> validator stake share
    (9 / 18) * 1.6 = 0.8 -> nominator stake share
    v1 validator total reward: 0.4 + 0.8 = 1.2 DOT
    v1 nominator reward: 0.8 DOT

    v2:
    (0.4 * 2) = 0.8 DOT -> validator payment
    (2 - 0.8) = 1.2 -> shared between all stake
    (3 / 9) * 1.2 = 0.4 -> validator stake share
    (6 / 9) * 1.2 = 0.8 -> nominator stake share
    v2 validator total reward: 0.8 + 0.4 = 1.2 DOT
    v2 nominator reward: 0.8 DOT

    v3:
    (0.1 * 2) = 0.2 DOT -> validator payment
    (2 - 0.2) = 1.8 -> shared between all stake
    (4 / 8) * 1.8 = 0.9 -> validator stake share
    (4 / 8) * 1.8 = 0.9 -> nominator stake share
    v3 validator total reward: 0.2 + 0.9 DOT = 1.1 DOT
    v3 nominator reward: 0.9 DOT

    v4:
    (0 * 2) = 0 DOT -> validator payment
    (2 - 0) = 2.0 -> shared between all stake
    (1 / 6) * 2 = 0.33 -> validator stake share
    (5 / 6) * 2 = 1.67 -> nominator stake share
    v4 validator total reward: 0 + 0.33 DOT = 0.33 DOT
    v4 nominator reward: 1.67 DOT
    - + \ No newline at end of file diff --git a/docs/maintain-index.html b/docs/maintain-index.html index 9394935616b1..d57198a52ae3 100644 --- a/docs/maintain-index.html +++ b/docs/maintain-index.html @@ -19,7 +19,7 @@ - + @@ -45,7 +45,7 @@ participate in governance.
  • How to join the Council - Step by step guide for running for the Council.
  • How to vote for a Councillor - Step by step guide for voting for your favorite councillors.
  • - + \ No newline at end of file diff --git a/docs/maintain-networks.html b/docs/maintain-networks.html index a4eda02f0a05..61b59f5f3901 100644 --- a/docs/maintain-networks.html +++ b/docs/maintain-networks.html @@ -19,7 +19,7 @@ - + @@ -54,7 +54,7 @@ the public Telemetry service.

    You can verify that your node is connected by navigating to the correct network on the dashboard and finding the name of your node.

    There is a built-in search function on the nodes page. Simply start typing keystrokes in the main window to make it available.

    - + \ No newline at end of file diff --git a/docs/maintain-polkadot-parameters.html b/docs/maintain-polkadot-parameters.html index 795abd651fd4..a8874ee26d77 100644 --- a/docs/maintain-polkadot-parameters.html +++ b/docs/maintain-polkadot-parameters.html @@ -19,7 +19,7 @@ - + @@ -39,7 +39,7 @@

    PolkadotTimeSlotsDescription
    Term duration1 Day14_400The time for which a validator is in the set after being elected. Note, this duration can be shortened in the case that a validator misbehaves.
    Nomination period1 Day14_400How often a new validator set is elected according to Phragmén's method.
    Bonding duration28 days403_200How long until your funds will be transferrable after unbonding. Note that the bonding duration is defined in eras, not directly by slots.
    Slash defer duration28 days403_200Prevents overslashing and validators "escaping" and getting their nominators slashed with no repercussions to themselves. Note that the bonding duration is defined in eras, not directly by slots.

    Parachains

    Crowdloans and AuctionsTimeSlotsDescription
    Auction duration7 days100_800The total duration of the slot auction, subject to the candle auction mechanism.
    Opening period2 days28_800The opening period of the slot auction.
    Ending period5 days72_000The ending period of the slot auction.
    Parachain SlotTimeSlotsDescription
    Lease period12 weeks1_209_600The length of one lease period in a parachain slot.
    Total slot duration2 years10_512_000The maximum duration a parachain can lease by winning a slot auction (8 lease periods).

    Treasury

    TreasuryTimeSlotsDescription
    Periods between spends24 days345_600When the treasury can spend again after spending previously.

    Burn percentage is currently 1.00%.

    Precision

    DOT have 10 decimals of precision. In other words, 10 ** 10 (10_000_000_000 or ten billion) Plancks make up a DOT.

    The denomination of DOT was changed from 12 decimals of precision at block #1,248,328 in an event known as Denomination Day. See Redenomination for details.

    - + \ No newline at end of file diff --git a/docs/maintain-rpc.html b/docs/maintain-rpc.html index 25bf359611b3..33b76f369336 100644 --- a/docs/maintain-rpc.html +++ b/docs/maintain-rpc.html @@ -19,7 +19,7 @@ - + @@ -54,7 +54,7 @@ node. Activate the "Development" toggle and input your node's address - either the domain or the IP address. Remember to prefix with wss://, and if you're using the 443 port, append :443 like so: wss://example.com:443.

    A sync-in-progress chain connected to Polkadot-JS UI

    Now you have a secure remote connect setup for your Substrate node.

    - + \ No newline at end of file diff --git a/docs/maintain-sync.html b/docs/maintain-sync.html index 14c510384fcc..ebac4a947f8d 100644 --- a/docs/maintain-sync.html +++ b/docs/maintain-sync.html @@ -19,7 +19,7 @@ - + @@ -77,8 +77,8 @@ users will have their work cut out for them. It's better to use a virtual machine instead.

    Test if the installation was successful by running cargo --version.

    λ cargo --version
    cargo 1.41.0 (626f0f40e 2019-12-03)

    Clone and Build

    The paritytech/polkadot repo's master branch contains the latest Polkadot code.

    git clone https://github.com/paritytech/polkadot polkadot
    cd polkadot
    ./scripts/init.sh
    cargo build --release

    Alternatively, if you wish to use a specific release, you can check out a specific tag (v0.8.3 in the example below):

    git clone https://github.com/paritytech/polkadot polkadot
    cd polkadot
    git checkout tags/v0.8.3
    ./scripts/init.sh
    cargo build --release

    Run

    The built binary will be in the target/release folder, called polkadot.

    Polkadot:

    ./target/release/polkadot --name "Your Node's Name"

    Use the --help flag to determine which flags you can use when running the node. For example, if -connecting to your node remotely, you'll probably want to use --rpc-external and ---rpc-cors all.

    The syncing process will take a while, depending on your capacity, processing power, disk speed and +connecting to your node remotely, you'll probably want to use --rpc-external +and --rpc-cors all.

    The syncing process will take a while, depending on your capacity, processing power, disk speed and RAM. On a \$10 DigitalOcean droplet, the process can complete in some 36 hours.

    Congratulations, you're now syncing with Polkadot. Keep in mind that the process is identical when using any other Substrate chain.

    Running an Archive Node

    When running as a simple sync node (above), only the state of the past 256 blocks will be kept. It defaults to archive mode when validating. To support the full state, use the @@ -87,10 +87,10 @@ after the node syncs.

    Using Docker

    Finally, you can use Docker to run your node in a container. Doing this is more advanced, so it's best left up to those already familiar with docker or who have completed the other set-up instructions in this guide. Be aware that when you run polkadot in docker, the process only listens -on localhost by default. If you would like to connect to your node's services (rpc, and -prometheus) you need to ensure that you run you node with the --rpc-external, and ---prometheus-external commands.

    docker run -p 9944:9944 -p 9615:9615 parity/polkadot:v0.9.13 --name "calling_home_from_a_docker_container" --rpc-external --prometheus-external
    - +on localhost by default. If you would like to connect to your node's services (rpc, and prometheus) +you need to ensure that you run you node with the --rpc-external, and --prometheus-external +commands.

    docker run -p 9944:9944 -p 9615:9615 parity/polkadot:v0.9.13 --name "calling_home_from_a_docker_container" --rpc-external --prometheus-external
    + \ No newline at end of file diff --git a/docs/maintain-wss.html b/docs/maintain-wss.html index d83afd00215a..d37ed9523487 100644 --- a/docs/maintain-wss.html +++ b/docs/maintain-wss.html @@ -19,7 +19,7 @@ - + @@ -43,7 +43,7 @@ node. Activate the "Development" toggle and input your node's address - either the domain or the IP address. Remember to prefix with wss:// and if you're using the 443 port, append :443, like so: wss://example.com:443.

    A sync-in-progress chain connected to Polkadot-JS UI

    Now you have a secure remote connect setup for your Substrate node.

    - + \ No newline at end of file diff --git a/docs/metadata.html b/docs/metadata.html index c685d5fab059..ce3e446d6ee0 100644 --- a/docs/metadata.html +++ b/docs/metadata.html @@ -19,7 +19,7 @@ - + @@ -29,7 +29,7 @@ The dropdown below allows you to update the chain selection to visualize. You can search all sub-categories using the provided search field. The information is categorized by the chains Pallets, RPC and Runtime information.

    - + \ No newline at end of file diff --git a/docs/polkadot-v1.html b/docs/polkadot-v1.html index 50f85817f971..162cc29df781 100644 --- a/docs/polkadot-v1.html +++ b/docs/polkadot-v1.html @@ -19,7 +19,7 @@ - + @@ -100,7 +100,7 @@ could become.

    Polkadot is perfecting its implementation through RFCs to continue being a decentralized, secure, ubiquitous computing engine to power the next generation of Web3 applications.

    - + \ No newline at end of file diff --git a/docs/polkadot-vault.html b/docs/polkadot-vault.html index 1fb12c43c46d..34d3cb4a627a 100644 --- a/docs/polkadot-vault.html +++ b/docs/polkadot-vault.html @@ -19,7 +19,7 @@ - + @@ -89,7 +89,7 @@ this article for detailed instructions. If you choose this approach, you should trust the provider you choose.

    Advanced How-to Guides

    See the advanced guides for more information about how to add chain specification and do metadata updates yourself.

    - + \ No newline at end of file diff --git a/docs/polkadot-vision-index.html b/docs/polkadot-vision-index.html index 116e50e1c14f..bebf99f39532 100644 --- a/docs/polkadot-vision-index.html +++ b/docs/polkadot-vision-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/polkadotjs-ui.html b/docs/polkadotjs-ui.html index c8051c31027b..c8cc6a2ad475 100644 --- a/docs/polkadotjs-ui.html +++ b/docs/polkadotjs-ui.html @@ -19,7 +19,7 @@ - + @@ -71,7 +71,7 @@ nomination pool settings (nomination and roles) and use non-transfer proxies, destroy assets, and much more.

    Beginner's Guide to Polkadot-JS

    - + \ No newline at end of file diff --git a/docs/polkadotjs.html b/docs/polkadotjs.html index 24cd6e5367c4..dfa30f9058b6 100644 --- a/docs/polkadotjs.html +++ b/docs/polkadotjs.html @@ -19,7 +19,7 @@ - + @@ -92,7 +92,7 @@ of spam prevention, whereas signed transactions are issued by the originator account of a transaction which contains a signature of that account, which will be subject to a fee to include it on the chain.

    - + \ No newline at end of file diff --git a/docs/programmes-index.html b/docs/programmes-index.html index d6c7fe83b79e..421a140e2b70 100644 --- a/docs/programmes-index.html +++ b/docs/programmes-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/research.html b/docs/research.html index de17325c42a5..1b4a3f154a44 100644 --- a/docs/research.html +++ b/docs/research.html @@ -19,7 +19,7 @@ - + @@ -54,7 +54,7 @@ – Gives an outline of Nominated Proof of Stake in Polkadot. Author: Alfonzo Cevallos
  • Messaging Protocol Workshop Outcomes – An initiative to design and implement a privacy-preserving communication system for decentralized applications.
  • - + \ No newline at end of file diff --git a/docs/staking-dashboard.html b/docs/staking-dashboard.html index af686be450de..2bde5c5d7f00 100644 --- a/docs/staking-dashboard.html +++ b/docs/staking-dashboard.html @@ -19,7 +19,7 @@ - + @@ -157,7 +157,7 @@ feature request. We take your feedback seriously, do not hesitate to contact us.

    Network

    Under Network, you can connect to either Polkadot, Kusama, or Westend through public RPC nodes or light clients for a true Web3 experience. For more information about light clients, see this page.

    - + \ No newline at end of file diff --git a/docs/start-building.html b/docs/start-building.html index 4103fba02fdc..a4381093cc75 100644 --- a/docs/start-building.html +++ b/docs/start-building.html @@ -19,7 +19,7 @@ - + @@ -38,7 +38,7 @@ code for the Agile Coretime Broker pallet was added to the Substrate FRAME system.

    Polkadot SDK

    info

    For more information about building on Polkadot, see the Builder's Guide.

    The Polkadot Software Development Kit (SDK) includes all the tools needed to build on the Polkadot ecosystem. The main repositories include:

    The programming language used for development is Rust.

    - + \ No newline at end of file diff --git a/docs/stay-safe-index.html b/docs/stay-safe-index.html index c07b420ba902..7cfb19995962 100644 --- a/docs/stay-safe-index.html +++ b/docs/stay-safe-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/docs/thousand-contributors.html b/docs/thousand-contributors.html index 6339e414d200..ad95f9684776 100644 --- a/docs/thousand-contributors.html +++ b/docs/thousand-contributors.html @@ -19,7 +19,7 @@ - + @@ -35,7 +35,7 @@ the account shared with us.

    Submission reviews

    The review process follows the present pipeline in the 1KC public GitHub project.

    Learn more about the program and its components on the official 1KC repository

    - + \ No newline at end of file diff --git a/docs/thousand-validators.html b/docs/thousand-validators.html index 02ee9e464822..6de232617bbf 100644 --- a/docs/thousand-validators.html +++ b/docs/thousand-validators.html @@ -19,7 +19,7 @@ - + @@ -87,7 +87,7 @@ things time to resolve; if they don't, leave a message in the dedicated matrix room or open an issue on GitHub.
  • The 1000 validators website is not up to date? See these resources for more up-to-date information.
  • Resources

    To extract and display the 1KV Program scores there are various tools listed below.

    ResourceGithub sourceInfo
    Main 1KV sitegithubMain site and 1KV backend.
    SubVT telegram bot for polkadot and kusamagithubTelegram bot with overviews and alerts for various polkadot and kusama related events, including 1KV events.
    SubVT ios and android appgithubSubVT app version for mobile phones.
    Validator earnings overviewgithubOverview of validators' earnings.
    Math Crypto's Insightsgithub1KV-oriented scoring overview of Kusama and Polkadot.
    One-T for polkadot and kusamagithubA performance report bot for the Polkadot and Kusama network with special focus on the 1KV programme.
    One-T parachains overviewgithubOne-T's parachain overview.
    Metaspan's 1KV overviewgithubOverview of 1KV programme, including the newly introduced endpoints, see here for available endpoints.
    Decentradot's 1KV overviewgithubOverview of the 1KV programme, including the newly introduced endpoints.
    Hirish 1KV overviewgithub?Overview of the 1KV Programme.
    - + \ No newline at end of file diff --git a/docs/wallets-and-extensions.html b/docs/wallets-and-extensions.html index 5a1b1f6f94bd..e30896fabaca 100644 --- a/docs/wallets-and-extensions.html +++ b/docs/wallets-and-extensions.html @@ -19,7 +19,7 @@ - + @@ -88,7 +88,7 @@ your accounts on over 150+ Substrate and EVM networks. NFT Management, ledger Support, fiat On-ramp, portfolio tracking. Talisman received funding from Polkadot Treasury [1].

    - + \ No newline at end of file diff --git a/docs/wallets-index.html b/docs/wallets-index.html index 7b0fdeccbd4d..29af388a2be6 100644 --- a/docs/wallets-index.html +++ b/docs/wallets-index.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file diff --git a/index.html b/index.html index 1ba5a0bbc4dd..1008f32b46e2 100644 --- a/index.html +++ b/index.html @@ -19,13 +19,13 @@ - +

    Learn about Polkadot’s canary network Kusama

    Kusama is Polkadot’s “canary network”, a scalable, multi-chain network for radical innovation and early stage Polkadot deployments. For developers, Kusama is a proving ground for all things Polkadot I.e runtime upgrades, on-chain governance, parachains, parathreads, etc.

    language

    Help improve this wiki

    This wiki was started by and is maintained by Web3 Foundation. It is an open-source-ish project and aims to be the most extensive resource of knowledge on Polkadot and the Polkadot ecosystem.

    - + \ No newline at end of file diff --git a/search.html b/search.html index 15f6c26b3470..68f7f23d2b98 100644 --- a/search.html +++ b/search.html @@ -19,13 +19,13 @@ - + - + \ No newline at end of file