+
"use strict";(self.webpackChunkmithril_doc=self.webpackChunkmithril_doc||[]).push([[4163,9531,2379],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(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<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=s(a),c=r,h=m["".concat(p,".").concat(c)]||m[c]||u[c]||i;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=c;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:r,l[1]=o;for(var s=2;s<i;s++)l[s]=a[s];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},85162:(e,t,a)=>{a.d(t,{Z:()=>l});var n=a(67294),r=a(86010);const i={tabItem:"tabItem_Ymn6"};function l(e){let{children:t,hidden:a,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,r.Z)(i.tabItem,l),hidden:a},t)}},74866:(e,t,a)=>{a.d(t,{Z:()=>_});var n=a(87462),r=a(67294),i=a(86010),l=a(12466),o=a(16550),p=a(91980),s=a(67392),d=a(50012);function m(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:r}}=e;return{value:t,label:a,attributes:n,default:r}}))}function u(e){const{values:t,children:a}=e;return(0,r.useMemo)((()=>{const e=t??m(a);return function(e){const t=(0,s.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function c(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function h(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.k6)(),i=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,p._X)(i),(0,r.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(n.location.search);t.set(i,e),n.replace({...n.location,search:t.toString()})}),[i,n])]}function k(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,i=u(e),[l,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!c({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:i}))),[p,s]=h({queryString:a,groupId:n}),[m,k]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,i]=(0,d.Nk)(a);return[n,(0,r.useCallback)((e=>{a&&i.set(e)}),[a,i])]}({groupId:n}),g=(()=>{const e=p??m;return c({value:e,tabValues:i})?e:null})();(0,r.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!c({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),s(e),k(e)}),[s,k,i]),tabValues:i}}var g=a(72389);const N={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function f(e){let{className:t,block:a,selectedValue:o,selectValue:p,tabValues:s}=e;const d=[],{blockElementScrollPositionUntilNextRender:m}=(0,l.o5)(),u=e=>{const t=e.currentTarget,a=d.indexOf(t),n=s[a].value;n!==o&&(m(t),p(n))},c=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const a=d.indexOf(e.currentTarget)+1;t=d[a]??d[0];break}case"ArrowLeft":{const a=d.indexOf(e.currentTarget)-1;t=d[a]??d[d.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":a},t)},s.map((e=>{let{value:t,label:a,attributes:l}=e;return r.createElement("li",(0,n.Z)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>d.push(e),onKeyDown:c,onClick:u},l,{className:(0,i.Z)("tabs__item",N.tabItem,l?.className,{"tabs__item--active":o===t})}),a??t)})))}function y(e){let{lazy:t,children:a,selectedValue:n}=e;const i=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=i.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},i.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function b(e){const t=k(e);return r.createElement("div",{className:(0,i.Z)("tabs-container",N.tabList)},r.createElement(f,(0,n.Z)({},e,t)),r.createElement(y,(0,n.Z)({},e,t)))}function _(e){const t=(0,g.Z)();return r.createElement(b,(0,n.Z)({key:String(t)},e))}},61494:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const i={unlisted:!0,hide_title:!0,hide_table_of_contents:!0},l=void 0,o={unversionedId:"compiled-binaries",id:"compiled-binaries",title:"compiled-binaries",description:"Each Release / Pre-Release distribution comes with pre compiled binaries ready to use or wrapped in a debian package",source:"@site/root/compiled-binaries.md",sourceDirName:".",slug:"/compiled-binaries",permalink:"/doc/next/compiled-binaries",draft:!1,editUrl:"https://github.com/input-output-hk/mithril/edit/main/docs/root/compiled-binaries.md",tags:[],version:"current",frontMatter:{unlisted:!0,hide_title:!0,hide_table_of_contents:!0}},p={},s=[],d={toc:s},m="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Each Release / Pre-Release distribution comes with pre compiled binaries ready to use or wrapped in a debian package\nfor linux\xb9."),(0,r.kt)("p",null,"You can download them from the Release / Pre-Release distribution page that depends on the Mithril Network you\nare targeting."),(0,r.kt)("p",null,"These links are available in the ",(0,r.kt)("strong",{parentName:"p"},"Build From")," column of the above ",(0,r.kt)("strong",{parentName:"p"},"Mithril Networks")," table."),(0,r.kt)("p",null,"\xb9 The Linux binaries target ",(0,r.kt)("inlineCode",{parentName:"p"},"glibc"),", and have a minimum requirement of ",(0,r.kt)("inlineCode",{parentName:"p"},"glibc 2.31")," (compatible with ",(0,r.kt)("inlineCode",{parentName:"p"},"Ubuntu 20.04"),"\nor ",(0,r.kt)("inlineCode",{parentName:"p"},"Debian Bullseye"),")."))}u.isMDXComponent=!0},99544:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>m});var n=a(87462),r=(a(67294),a(3905)),i=a(81900),l=a(61494);const o={sidebar_position:3},p="Run a Mithril signer as an SPO",s={unversionedId:"manual/getting-started/run-signer-node",id:"manual/getting-started/run-signer-node",title:"Run a Mithril signer as an SPO",description:"For more information about the Mithril protocol, see the section About Mithril.",source:"@site/root/manual/getting-started/run-signer-node.md",sourceDirName:"manual/getting-started",slug:"/manual/getting-started/run-signer-node",permalink:"/doc/next/manual/getting-started/run-signer-node",draft:!1,editUrl:"https://github.com/input-output-hk/mithril/edit/main/docs/root/manual/getting-started/run-signer-node.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"docSideBar",previous:{title:"Bootstrap a Cardano node",permalink:"/doc/next/manual/getting-started/bootstrap-cardano-node"},next:{title:"Run a private Mithril network",permalink:"/doc/next/manual/getting-started/run-mithril-devnet"}},d={},m=[{value:"Mithril signer deployment model",id:"mithril-signer-deployment-model",level:2},{value:"Mithril keys certification",id:"mithril-keys-certification",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Set up the Mithril signer node",id:"set-up-the-mithril-signer-node",level:2},{value:"Building your own executable",id:"building-your-own-executable",level:3},{value:"Download the source file",id:"download-the-source-file",level:4},{value:"Build the Mithril signer binary",id:"build-the-mithril-signer-binary",level:4},{value:"Download the pre-built binary",id:"download-the-pre-built-binary",level:3},{value:"Verifying the binary",id:"verifying-the-binary",level:3},{value:"Verify the version of the binary",id:"verify-the-version-of-the-binary",level:4},{value:"Verify the build",id:"verify-the-build",level:4},{value:"Installing the service",id:"installing-the-service",level:3},{value:"Move the executable",id:"move-the-executable",level:4},{value:"Set up the service",id:"set-up-the-service",level:4},{value:"Rotating the KES keys",id:"rotating-the-kes-keys",level:3},{value:"Set up the Mithril relay node",id:"set-up-the-mithril-relay-node",level:2},{value:"Configuring the Squid service",id:"configuring-the-squid-service",level:3},{value:"Firewall configuration",id:"firewall-configuration",level:3},{value:"About the Cardano relay machine",id:"about-the-cardano-relay-machine",level:4},{value:"Verify the Mithril signer deployment",id:"verify-the-mithril-signer-deployment",level:2},{value:"Verify your signer is registered",id:"verify-your-signer-is-registered",level:3},{value:"Verify your signer contributes with individual signatures",id:"verify-your-signer-contributes-with-individual-signatures",level:3}],u={toc:m},c="wrapper";function h(e){let{components:t,...o}=e;return(0,r.kt)(c,(0,n.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"run-a-mithril-signer-as-an-spo"},"Run a Mithril signer as an SPO"),(0,r.kt)("admonition",{title:"Mithril networks",type:"note"},(0,r.kt)(i.default,{mdxType:"NetworksMatrix"})),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For more information about the ",(0,r.kt)("strong",{parentName:"p"},"Mithril protocol"),", see the section ",(0,r.kt)("a",{parentName:"p",href:"/doc/next/mithril/intro"},"About Mithril"),".")),(0,r.kt)("h2",{id:"mithril-signer-deployment-model"},"Mithril signer deployment model"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"In this guide, you will learn how to set up a ",(0,r.kt)("strong",{parentName:"p"},"Mithril signer")," within the stake pool operator (SPO) infrastructure both on Cardano ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"testnet")," environments:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"On ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet"),", you ",(0,r.kt)("strong",{parentName:"li"},"must")," run the ",(0,r.kt)("strong",{parentName:"li"},"production")," deployment where the ",(0,r.kt)("strong",{parentName:"li"},"Mithril signer")," runs on the ",(0,r.kt)("strong",{parentName:"li"},"Cardano block producer")," machine and the ",(0,r.kt)("strong",{parentName:"li"},"Mithril relay")," runs on the ",(0,r.kt)("strong",{parentName:"li"},"Cardano relay")," machine. ",(0,r.kt)("strong",{parentName:"li"},"Note")," that you can run the ",(0,r.kt)("strong",{parentName:"li"},"production")," deployment on ",(0,r.kt)("inlineCode",{parentName:"li"},"testnet"),"."),(0,r.kt)("li",{parentName:"ul"},"You can also run ",(0,r.kt)("strong",{parentName:"li"},"naive")," deployment, where the ",(0,r.kt)("strong",{parentName:"li"},"Mithril signer")," runs on the ",(0,r.kt)("strong",{parentName:"li"},"Cardano relay")," machine. This is possible in the testnet environment only, and does not require setting up a ",(0,r.kt)("strong",{parentName:"li"},"Mithril relay"),"."))),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"In the current setup, you don't need to install a Mithril aggregator.")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The ",(0,r.kt)("strong",{parentName:"p"},"production")," deployment model is currently in the beta version.")),(0,r.kt)("p",null,"Here is the schema of the ",(0,r.kt)("strong",{parentName:"p"},"production")," deployment on mainnet:\n",(0,r.kt)("a",{target:"_blank",href:a(34310).Z},(0,r.kt)("img",{alt:"Production Mithril Signer Deployment Model",src:a(82997).Z,width:"2208",height:"452"}))),(0,r.kt)("p",null,"and the schema of the ",(0,r.kt)("strong",{parentName:"p"},"naive")," deployment specifically for ",(0,r.kt)("inlineCode",{parentName:"p"},"testnets"),":\n",(0,r.kt)("a",{target:"_blank",href:a(66182).Z},(0,r.kt)("img",{alt:"Naive Mithril Signer Deployment Model",src:a(50532).Z,width:"2209",height:"452"}))),(0,r.kt)("admonition",{type:"danger"},(0,r.kt)("p",{parentName:"admonition"},"On ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet"),", you must ",(0,r.kt)("strong",{parentName:"p"},"never")," copy the ",(0,r.kt)("inlineCode",{parentName:"p"},"KES secret key")," from the ",(0,r.kt)("strong",{parentName:"p"},"Cardano block producer")," machine!")),(0,r.kt)("h2",{id:"mithril-keys-certification"},"Mithril keys certification"),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"Mithril signer")," uses your Cardano ",(0,r.kt)("inlineCode",{parentName:"p"},"operational certificate")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"KES secret key")," files which enable:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Automatic computation of the ",(0,r.kt)("inlineCode",{parentName:"li"},"PoolId")),(0,r.kt)("li",{parentName:"ul"},"Verification of your ",(0,r.kt)("inlineCode",{parentName:"li"},"PoolId")," ownership and the associated stake used by the Mithril protocol"),(0,r.kt)("li",{parentName:"ul"},"Verification of your Mithril ",(0,r.kt)("inlineCode",{parentName:"li"},"signer secret key")," ownership, which allows you to participate in the multi-signature process for certificate production on the Mithril network")),(0,r.kt)("h2",{id:"pre-requisites"},"Pre-requisites"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Note that this guide works on a Linux machine only.")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"To operate a ",(0,r.kt)("strong",{parentName:"p"},"Cardano node")," as a ",(0,r.kt)("strong",{parentName:"p"},"stake pool"),", you need:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The pool's ",(0,r.kt)("inlineCode",{parentName:"li"},"operational certificate")," "),(0,r.kt)("li",{parentName:"ul"},"The pool's ",(0,r.kt)("inlineCode",{parentName:"li"},"KES secret key")," "))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"To access the file system of the ",(0,r.kt)("strong",{parentName:"p"},"Cardano block producer")," node for ",(0,r.kt)("strong",{parentName:"p"},"production")," deployment (or of the ",(0,r.kt)("strong",{parentName:"p"},"Cardano relay")," node for ",(0,r.kt)("strong",{parentName:"p"},"naive")," deployment), you will need the following permissions:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Read rights on the ",(0,r.kt)("inlineCode",{parentName:"li"},"Database")," folder (specified by the ",(0,r.kt)("inlineCode",{parentName:"li"},"--database-path")," setting of the ",(0,r.kt)("strong",{parentName:"li"},"Cardano node"),")"),(0,r.kt)("li",{parentName:"ul"},"Read and write rights on the ",(0,r.kt)("inlineCode",{parentName:"li"},"Inter Process Communication")," file (typically defined by the ",(0,r.kt)("inlineCode",{parentName:"li"},"CARDANO_NODE_SOCKET_PATH")," environment variable used to launch the ",(0,r.kt)("strong",{parentName:"li"},"Cardano node"),")"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install a recent version of ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.1.2"},(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli"))," (version 8.1.2+).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install a correctly configured Rust toolchain (latest stable version). You can follow the instructions provided ",(0,r.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/learn/get-started"},"here"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install OpenSSL development libraries. For example, on Ubuntu/Debian/Mint, run ",(0,r.kt)("inlineCode",{parentName:"p"},"apt install libssl-dev"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install a recent version of ",(0,r.kt)("inlineCode",{parentName:"p"},"jq")," (version 1.6+). You can install it by running ",(0,r.kt)("inlineCode",{parentName:"p"},"apt install jq"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Only for the ",(0,r.kt)("strong",{parentName:"p"},"production")," deployment, install a recent version of ",(0,r.kt)("a",{parentName:"p",href:"http://www.squid-cache.org/"},(0,r.kt)("inlineCode",{parentName:"a"},"squid-cache"))," (version 5.2+). You can install it by running ",(0,r.kt)("inlineCode",{parentName:"p"},"apt install squid"),"."))),(0,r.kt)("h2",{id:"set-up-the-mithril-signer-node"},"Set up the Mithril signer node"),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"For ",(0,r.kt)("strong",{parentName:"p"},"production")," deployment, the ",(0,r.kt)("strong",{parentName:"p"},"Mithril signer")," setup is performed on the ",(0,r.kt)("strong",{parentName:"p"},"Cardano block producer")," machine.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"For ",(0,r.kt)("strong",{parentName:"p"},"naive")," deployment, the ",(0,r.kt)("strong",{parentName:"p"},"Mithril signer")," setup is performed on the ",(0,r.kt)("strong",{parentName:"p"},"Cardano relay")," machine.")))),(0,r.kt)("h3",{id:"building-your-own-executable"},"Building your own executable"),(0,r.kt)("h4",{id:"download-the-source-file"},"Download the source file"),(0,r.kt)("p",null,"To download the source from GitHub (HTTPS), run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/input-output-hk/mithril.git\n")),(0,r.kt)("p",null,"Or (SSH):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone [email protected]:input-output-hk/mithril.git\n")),(0,r.kt)("h4",{id:"build-the-mithril-signer-binary"},"Build the Mithril signer binary"),(0,r.kt)("p",null,"First, switch to build a branch/tag:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# **YOUR_BUILD_BRANCH_OR_TAG** depends on the Mithril network you target, \n# please refer to the **Build from** column of the above **Mithril networks** table\ngit checkout **YOUR_BUILD_BRANCH_OR_TAG**\n")),(0,r.kt)("p",null,"Then, change the directory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd mithril/mithril-signer\n")),(0,r.kt)("p",null,"Run tests (optional):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"make test\n")),(0,r.kt)("p",null,"Finally, build the executable:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"make build\n")),(0,r.kt)("h3",{id:"download-the-pre-built-binary"},"Download the pre-built binary"),(0,r.kt)(l.default,{mdxType:"CompiledBinaries"}),(0,r.kt)("h3",{id:"verifying-the-binary"},"Verifying the binary"),(0,r.kt)("h4",{id:"verify-the-version-of-the-binary"},"Verify the version of the binary"),(0,r.kt)("p",null,"You can check that the Mithril signer binary is running the correct version by running:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"./mithril-signer -V\n")),(0,r.kt)("p",null,"You should see something like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"mithril-signer 0.2.0\n")),(0,r.kt)("p",null,"\u26a0\ufe0f Please verify that the displayed version matches the version described in the release/pre-release notes (refer to the ",(0,r.kt)("strong",{parentName:"p"},"Build from")," column in the ",(0,r.kt)("strong",{parentName:"p"},"Mithril networks")," table above)."),(0,r.kt)("h4",{id:"verify-the-build"},"Verify the build"),(0,r.kt)("p",null,"Check that the Mithril signer binary is working correctly by running the help function:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"./mithril-signer -h\n")),(0,r.kt)("p",null,"You should see:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"An implementation of a Mithril signer\n\nUsage: mithril-signer [OPTIONS]\n\nOptions:\n -r, --run-mode <RUN_MODE>\n Run Mode [env: RUN_MODE=] [default: dev]\n -v, --verbose...\n Verbosity level, add more v to increase\n -c, --configuration-dir <CONFIGURATION_DIR>\n Directory where the configuration file is located [default: ./config]\n --disable-digests-cache\n Disable immutables digests cache\n --reset-digests-cache\n If set the existing immutables digests cache will be reset\n -h, --help\n Print help information (use `--help` for more detail)\n -V, --version\n Print version information\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you wish to delve deeper, you can access logs at various levels from the Mithril signer:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"Add ",(0,r.kt)("inlineCode",{parentName:"li"},"-v")," for some logs (WARN)"),(0,r.kt)("li",{parentName:"ul"},"Add ",(0,r.kt)("inlineCode",{parentName:"li"},"-vv")," for more logs (INFO)"),(0,r.kt)("li",{parentName:"ul"},"Add ",(0,r.kt)("inlineCode",{parentName:"li"},"-vvv")," for even more logs (DEBUG)"),(0,r.kt)("li",{parentName:"ul"},"Add ",(0,r.kt)("inlineCode",{parentName:"li"},"-vvvv")," for all logs (TRACE)"))),(0,r.kt)("h3",{id:"installing-the-service"},"Installing the service"),(0,r.kt)("h4",{id:"move-the-executable"},"Move the executable"),(0,r.kt)("p",null,"To move the executable to /opt/mithril, run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo mkdir -p /opt/mithril\nsudo mv mithril-signer /opt/mithril\n")),(0,r.kt)("h4",{id:"set-up-the-service"},"Set up the service"),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"User=cardano"),":\nReplace this value with the correct user. We assume that the user used to run the ",(0,r.kt)("strong",{parentName:"p"},"Cardano node")," is ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano"),". The ",(0,r.kt)("strong",{parentName:"p"},"Mithril signer")," must imperatively run with the same user.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"In the ",(0,r.kt)("inlineCode",{parentName:"p"},"/opt/mithril/mithril-signer/service.env")," env file:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"KES_SECRET_KEY_PATH=/cardano/keys/kes.skey"),": replace ",(0,r.kt)("inlineCode",{parentName:"li"},"/cardano/keys/kes.skey")," with the path to your Cardano ",(0,r.kt)("inlineCode",{parentName:"li"},"KES secret key")," file"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"OPERATIONAL_CERTIFICATE_PATH=/cardano/cert/opcert.cert"),": replace ",(0,r.kt)("inlineCode",{parentName:"li"},"/cardano/cert/opcert.cert")," with the path to your Cardano ",(0,r.kt)("inlineCode",{parentName:"li"},"operational certificate")," file"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"DB_DIRECTORY=/cardano/db"),": replace ",(0,r.kt)("inlineCode",{parentName:"li"},"/cardano/db")," with the path to the database folder of the ",(0,r.kt)("strong",{parentName:"li"},"Cardano node")," (the one in ",(0,r.kt)("inlineCode",{parentName:"li"},"--database-path"),")"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"CARDANO_NODE_SOCKET_PATH=/cardano/ipc/node.socket"),": replace with the path to the IPC file (",(0,r.kt)("inlineCode",{parentName:"li"},"CARDANO_NODE_SOCKET_PATH")," env var)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"CARDANO_CLI_PATH=/app/bin/cardano-cli"),": replace with the path to the ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-cli")," executable"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"DATA_STORES_DIRECTORY=/opt/mithril/stores"),": replace with the path to a folder where the ",(0,r.kt)("strong",{parentName:"li"},"Mithril signer")," will store its data (",(0,r.kt)("inlineCode",{parentName:"li"},"/opt/mithril/stores")," e.g.)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"STORE_RETENTION_LIMIT"),": if set, this will limit the number of records in some internal stores (5 is a good fit)."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"ERA_READER_ADAPTER_TYPE=cardano-chain"),": replace ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-chain")," with the era reader adapter type used in your Mithril network"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'ERA_READER_ADAPTER_PARAMS={"address": "...", "verification_key": "..."}'),": replace ",(0,r.kt)("inlineCode",{parentName:"li"},'{"address": "...", "verification_key": "..."}')," with the era reader parameters that you need to compute by running the command ",(0,r.kt)("inlineCode",{parentName:"li"},'jq -nc --arg address $(wget -q -O - **YOUR_ERA_READER_ADDRESS**) --arg verification_key $(wget -q -O - **YOUR_ERA_READER_VERIFICATION_KEY**) \'{"address": $address, "verification_key": $verification_key}\'')),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"RELAY_ENDPOINT=http://192.168.1.50:3132")," ",(0,r.kt)("strong",{parentName:"li"},"(optional)"),": this is the endpoint of the ",(0,r.kt)("strong",{parentName:"li"},"Mithril relay"),", which is required for ",(0,r.kt)("strong",{parentName:"li"},"production")," deployment only. For ",(0,r.kt)("strong",{parentName:"li"},"naive")," deployment, do not set this variable in your environment file."))))),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an ",(0,r.kt)("strong",{parentName:"p"},"example")," set of values for ",(0,r.kt)("strong",{parentName:"p"},"release-preprod")," that will be used in this guide in the ",(0,r.kt)("strong",{parentName:"p"},"tip")," boxes to illustrate some commands: "),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_KES_SECRET_KEY_PATH**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"/cardano/keys/kes.skey")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_OPERATIONAL_CERTIFICATE_PATH**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"/cardano/keys/node.cert")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_CARDANO_NETWORK**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"preprod")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_AGGREGATOR_ENDPOINT**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"https://aggregator.release-preprod.api.mithril.network/aggregator")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_ERA_READER_ADAPTER_TYPE**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-chain")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_ERA_READER_ADAPTER_PARAMS**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},'{"address": "addr_test1qpkyv2ws0deszm67t840sdnruqgr492n80g3y96xw3p2ksk6suj5musy6w8lsg3yjd09cnpgctc2qh386rtxphxt248qr0npnx", "verification_key": "5b35352c3232382c3134342c38372c3133382c3133362c34382c382c31342c3138372c38352c3134382c39372c3233322c3235352c3232392c33382c3234342c3234372c3230342c3139382c31332c33312c3232322c32352c3136342c35322c3130322c39312c3132302c3230382c3134375d"}')),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_RELAY_ENDPOINT**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"192.168.1.50")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_RELAY_LISTENING_PORT**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"3132")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_BLOCK_PRODUCER_INTERNAL_IP**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"192.168.1.75")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_SIGNER_LOGS_PATH**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"/var/log/syslog")),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_PARTY_ID**"),": ",(0,r.kt)("inlineCode",{parentName:"li"},"pool1hp72sauk0g0yqm4dzllz0pz6j93gewhllkzphn4hykkfmne43y")))),(0,r.kt)("p",null,"First, create an environment file that will be used by the service:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"for ",(0,r.kt)("strong",{parentName:"li"},"production")," deployment:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo bash -c 'cat > /opt/mithril/mithril-signer.env << EOF\nKES_SECRET_KEY_PATH=**YOUR_KES_SECRET_KEY_PATH**\nOPERATIONAL_CERTIFICATE_PATH=**YOUR_OPERATIONAL_CERTIFICATE_PATH**\nNETWORK=**YOUR_CARDANO_NETWORK**\nAGGREGATOR_ENDPOINT=**YOUR_AGGREGATOR_ENDPOINT**\nRUN_INTERVAL=60000\nDB_DIRECTORY=/cardano/db\nCARDANO_NODE_SOCKET_PATH=/cardano/ipc/node.socket\nCARDANO_CLI_PATH=/app/bin/cardano-cli\nDATA_STORES_DIRECTORY=/opt/mithril/stores\nSTORE_RETENTION_LIMIT=5\nERA_READER_ADAPTER_TYPE=**YOUR_ERA_READER_ADAPTER_TYPE**\nERA_READER_ADAPTER_PARAMS=**YOUR_ERA_READER_ADAPTER_PARAMS**\nRELAY_ENDPOINT=**YOUR_RELAY_ENDPOINT**\nEOF'\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an example of the aforementioned command created with the example set for ",(0,r.kt)("inlineCode",{parentName:"p"},"release-preprod"),":"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'sudo bash -c \'cat > /opt/mithril/mithril-signer.env << EOF\nKES_SECRET_KEY_PATH=/cardano/keys/kes.skey\nOPERATIONAL_CERTIFICATE_PATH=/cardano/keys/node.cert\nNETWORK=preprod\nAGGREGATOR_ENDPOINT=https://aggregator.release-preprod.api.mithril.network/aggregator\nRUN_INTERVAL=60000\nDB_DIRECTORY=/cardano/db\nCARDANO_NODE_SOCKET_PATH=/cardano/ipc/node.socket\nCARDANO_CLI_PATH=/app/bin/cardano-cli\nDATA_STORES_DIRECTORY=/opt/mithril/stores\nSTORE_RETENTION_LIMIT=5\nERA_READER_ADAPTER_TYPE=cardano-chain\nERA_READER_ADAPTER_PARAMS={"address": "addr_test1qpkyv2ws0deszm67t840sdnruqgr492n80g3y96xw3p2ksk6suj5musy6w8lsg3yjd09cnpgctc2qh386rtxphxt248qr0npnx", "verification_key": "5b35352c3232382c3134342c38372c3133382c3133362c34382c382c31342c3138372c38352c3134382c39372c3233322c3235352c3232392c33382c3234342c3234372c3230342c3139382c31332c33312c3232322c32352c3136342c35322c3130322c39312c3132302c3230382c3134375d"}\nRELAY_ENDPOINT=http://192.168.1.50:3132\nEOF\'\n'))),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"for ",(0,r.kt)("strong",{parentName:"li"},"naive")," deployment:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo bash -c 'cat > /opt/mithril/mithril-signer.env << EOF\nKES_SECRET_KEY_PATH=**YOUR_KES_SECRET_KEY_PATH**\nOPERATIONAL_CERTIFICATE_PATH=**YOUR_OPERATIONAL_CERTIFICATE_PATH**\nNETWORK=**YOUR_CARDANO_NETWORK**\nAGGREGATOR_ENDPOINT=**YOUR_AGGREGATOR_ENDPOINT**\nRUN_INTERVAL=60000\nDB_DIRECTORY=/cardano/db\nCARDANO_NODE_SOCKET_PATH=/cardano/ipc/node.socket\nCARDANO_CLI_PATH=/app/bin/cardano-cli\nDATA_STORES_DIRECTORY=/opt/mithril/stores\nSTORE_RETENTION_LIMIT=5\nERA_READER_ADAPTER_TYPE=**YOUR_ERA_READER_ADAPTER_TYPE**\nERA_READER_ADAPTER_PARAMS=**YOUR_ERA_READER_ADAPTER_PARAMS**\nEOF'\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an example of the aforementioned command created with the example set for ",(0,r.kt)("inlineCode",{parentName:"p"},"release-preprod"),":"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'sudo bash -c \'cat > /opt/mithril/mithril-signer.env << EOF\nKES_SECRET_KEY_PATH=/cardano/keys/kes.skey\nOPERATIONAL_CERTIFICATE_PATH=/cardano/keys/node.cert\nNETWORK=preprod\nAGGREGATOR_ENDPOINT=https://aggregator.release-preprod.api.mithril.network/aggregator\nRUN_INTERVAL=60000\nDB_DIRECTORY=/cardano/db\nCARDANO_NODE_SOCKET_PATH=/cardano/ipc/node.socket\nCARDANO_CLI_PATH=/app/bin/cardano-cli\nDATA_STORES_DIRECTORY=/opt/mithril/stores\nSTORE_RETENTION_LIMIT=5\nERA_READER_ADAPTER_TYPE=cardano-chain\nERA_READER_ADAPTER_PARAMS={"address": "addr_test1qpkyv2ws0deszm67t840sdnruqgr492n80g3y96xw3p2ksk6suj5musy6w8lsg3yjd09cnpgctc2qh386rtxphxt248qr0npnx", "verification_key": "5b35352c3232382c3134342c38372c3133382c3133362c34382c382c31342c3138372c38352c3134382c39372c3233322c3235352c3232392c33382c3234342c3234372c3230342c3139382c31332c33312c3232322c32352c3136342c35322c3130322c39312c3132302c3230382c3134375d"}\nEOF\'\n'))),(0,r.kt)("p",null,"Then, create a ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/systemd/system/mithril-signer.service")," description file for the service:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo bash -c 'cat > /etc/systemd/system/mithril-signer.service << EOF\n[Unit]\nDescription=Mithril signer service\nStartLimitIntervalSec=0\n\n[Service]\nType=simple\nRestart=always\nRestartSec=1\nUser=cardano\nEnvironmentFile=/opt/mithril/mithril-signer.env\nExecStart=/opt/mithril/mithril-signer -vvv\n\n[Install]\nWantedBy=multi-user.target\nEOF'\n")),(0,r.kt)("p",null,"Reload the service configuration (optional):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl daemon-reload\n")),(0,r.kt)("p",null,"Then, start the service:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl start mithril-signer\n")),(0,r.kt)("p",null,"Register the service to start on boot:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl enable mithril-signer\n")),(0,r.kt)("p",null,"Monitor the status of the service:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"systemctl status mithril-signer.service\n")),(0,r.kt)("p",null,"Finally, monitor the logs of the service:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"tail /var/log/syslog\n")),(0,r.kt)("h3",{id:"rotating-the-kes-keys"},"Rotating the KES keys"),(0,r.kt)("admonition",{type:"danger"},(0,r.kt)("p",{parentName:"admonition"},"When the KES keys expire, the Mithril signer is unable to register with the Mithril protocol.")),(0,r.kt)("p",null,"After rotating the KES keys on your Cardano block producer, we recommend following this upgrade procedure for your Mithril signer node:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Update the ",(0,r.kt)("inlineCode",{parentName:"li"},"KES_SECRET_KEY_PATH")," entry of your environment file to reflect the location of the ",(0,r.kt)("strong",{parentName:"li"},"new KES secret key file"),"."),(0,r.kt)("li",{parentName:"ol"},"Update the ",(0,r.kt)("inlineCode",{parentName:"li"},"OPERATIONAL_CERTIFICATE_PATH")," entry of your environment file to reflect the location of the ",(0,r.kt)("strong",{parentName:"li"},"new operational certificate file"),"."),(0,r.kt)("li",{parentName:"ol"},"Restart your Mithril signer service with the following command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl restart mithril-signer\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Check the logs of your signer node and make sure that it has successfully registered after restarting (the following log should be displayed: ",(0,r.kt)("inlineCode",{parentName:"li"},"STATE MACHINE: new cycle: Registered"),").")),(0,r.kt)("h2",{id:"set-up-the-mithril-relay-node"},"Set up the Mithril relay node"),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"For ",(0,r.kt)("strong",{parentName:"p"},"production")," deployment, the setup of the ",(0,r.kt)("strong",{parentName:"p"},"Mithril relay")," is performed on the ",(0,r.kt)("strong",{parentName:"p"},"Cardano relay")," machine.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"For ",(0,r.kt)("strong",{parentName:"p"},"naive")," deployment: this step is not necessary.")))),(0,r.kt)("h3",{id:"configuring-the-squid-service"},"Configuring the Squid service"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The ",(0,r.kt)("strong",{parentName:"p"},"Mithril relay")," node serves as a forward proxy, relaying traffic between the ",(0,r.kt)("strong",{parentName:"p"},"Mithril signer")," and the ",(0,r.kt)("strong",{parentName:"p"},"Mithril aggregator"),". When appropriately configured, it facilitates the security of the ",(0,r.kt)("strong",{parentName:"p"},"block-producing")," node. You can use ",(0,r.kt)("inlineCode",{parentName:"p"},"squid")," to operate this forward proxy, and this section presents a recommended configuration.")),(0,r.kt)("p",null,"Verify that the service was correctly configured at installation:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl status squid\n")),(0,r.kt)("p",null,"Make a copy of the original configuration:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak\n")),(0,r.kt)("p",null,"Prepare the forward proxy configuration file:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo bash -c 'cat > /etc/squid/squid.conf << EOF\n# Listening port (port 3132 is recommended)\nhttp_port **YOUR_RELAY_LISTENING_PORT**\n\n# ACL for internal IP of your block producer node\nacl block_producer_internal_ip src **YOUR_BLOCK_PRODUCER_INTERNAL_IP**\n\n# ACL for aggregator endpoint\nacl aggregator_domain dstdomain .mithril.network\n\n# ACL for SSL port only\nacl SSL_port port 443\n\n# Allowed traffic\nhttp_access allow block_producer_internal_ip aggregator_domain SSL_port\n\n# Do not disclose block producer internal IP\nforwarded_for delete\n\n# Turn off via header\nvia off\n \n# Deny request for original source of a request\nfollow_x_forwarded_for deny all\n \n# Anonymize request headers\nrequest_header_access Authorization allow all\nrequest_header_access Proxy-Authorization allow all\nrequest_header_access Cache-Control allow all\nrequest_header_access Content-Length allow all\nrequest_header_access Content-Type allow all\nrequest_header_access Date allow all\nrequest_header_access Host allow all\nrequest_header_access If-Modified-Since allow all\nrequest_header_access Pragma allow all\nrequest_header_access Accept allow all\nrequest_header_access Accept-Charset allow all\nrequest_header_access Accept-Encoding allow all\nrequest_header_access Accept-Language allow all\nrequest_header_access Connection allow all\nrequest_header_access All deny all\n\n# Disable cache\ncache deny all\n\n# Deny everything else\nhttp_access deny all\nEOF'\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an example of the aforementioned command created with the example set for ",(0,r.kt)("inlineCode",{parentName:"p"},"release-preprod"),":"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo bash -c 'cat > /etc/squid/squid.conf << EOF\n# Listening port (port 3132 is recommended)\nhttp_port 3132\n\n# ACL for internal IP of your block producer node\nacl block_producer_internal_ip src 192.168.1.75\n\n# ACL for aggregator endpoint\nacl aggregator_domain dstdomain .mithril.network\n\n# ACL for SSL port only\nacl SSL_port port 443\n\n# Allowed traffic\nhttp_access allow block_producer_internal_ip aggregator_domain SSL_port\n\n# Do not disclose block producer internal IP\nforwarded_for delete\n\n# Turn off via header\nvia off\n \n# Deny request for original source of a request\nfollow_x_forwarded_for deny all\n \n# Anonymize request headers\nrequest_header_access Authorization allow all\nrequest_header_access Proxy-Authorization allow all\nrequest_header_access Cache-Control allow all\nrequest_header_access Content-Length allow all\nrequest_header_access Content-Type allow all\nrequest_header_access Date allow all\nrequest_header_access Host allow all\nrequest_header_access If-Modified-Since allow all\nrequest_header_access Pragma allow all\nrequest_header_access Accept allow all\nrequest_header_access Accept-Charset allow all\nrequest_header_access Accept-Encoding allow all\nrequest_header_access Accept-Language allow all\nrequest_header_access Connection allow all\nrequest_header_access All deny all\n\n# Disable cache\ncache deny all\n\n# Deny everything else\nhttp_access deny all\nEOF'\n"))),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"In case you are using the same Cardano relay for multiple Cardano block producers, you will need to add a new line per block producer for authorizing its internal IP:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# ACL for internal IP of your block producer node\nacl block_producer_internal_ip src **YOUR_BLOCK_PRODUCER_INTERNAL_IP_1**\nacl block_producer_internal_ip src **YOUR_BLOCK_PRODUCER_INTERNAL_IP_2**\nacl block_producer_internal_ip src **YOUR_BLOCK_PRODUCER_INTERNAL_IP_3**\n"))),(0,r.kt)("p",null,"With this configuration, the proxy will:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"accept incoming traffic originating from the internal IP of the block-producing machine"),(0,r.kt)("li",{parentName:"ul"},"accept incoming traffic directed to the listening port of the proxy"),(0,r.kt)("li",{parentName:"ul"},"accept incoming HTTPS traffic proxied to ",(0,r.kt)("inlineCode",{parentName:"li"},"mithril.network")," domain hosts"),(0,r.kt)("li",{parentName:"ul"},"anonymize completely the traffic and avoid disclosing any information about the block-producing machine"),(0,r.kt)("li",{parentName:"ul"},"deny all other traffic")),(0,r.kt)("p",null,"Restart the service:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl restart squid\n")),(0,r.kt)("p",null,"Ensure it runs properly:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl status squid\n")),(0,r.kt)("p",null,"Finally, monitor service logs:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"tail /var/log/syslog\n")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Here is the command to see squid access logs:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"tail /var/log/squid/access.log\n"))),(0,r.kt)("h3",{id:"firewall-configuration"},"Firewall configuration"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"We assume that the ",(0,r.kt)("strong",{parentName:"p"},"Cardano relay")," machine is protected by a firewall. It is necessary to allow the proxied traffic, originating from the ",(0,r.kt)("strong",{parentName:"p"},"Cardano block producer"),", through this firewall.")),(0,r.kt)("h4",{id:"about-the-cardano-relay-machine"},"About the Cardano relay machine"),(0,r.kt)("p",null,"You need to allow incoming traffic on the listening port of the ",(0,r.kt)("strong",{parentName:"p"},"Mithril relay")," on the ",(0,r.kt)("strong",{parentName:"p"},"Cardano relay")," machine, originating from the ",(0,r.kt)("strong",{parentName:"p"},"Cardano block producer")," machine."),(0,r.kt)("p",null,"Assuming you are using ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Uncomplicated_Firewall"},(0,r.kt)("inlineCode",{parentName:"a"},"Uncomplicated Firewall"))," (",(0,r.kt)("inlineCode",{parentName:"p"},"0.36+"),"), the command to open that traffic is:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo ufw allow from **YOUR_BLOCK_PRODUCER_INTERNAL_IP** to any port **YOUR_RELAY_LISTENING_PORT** proto tcp\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an example of the aforementioned command created with the example set for ",(0,r.kt)("inlineCode",{parentName:"p"},"release-preprod"),":"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo ufw allow from 192.168.1.75 to any port 3132 proto tcp\n"))),(0,r.kt)("p",null,"Assuming you are using ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Iptables"},(0,r.kt)("inlineCode",{parentName:"a"},"Iptables"))," (",(0,r.kt)("inlineCode",{parentName:"p"},"1.8.7+"),"), the command to open that traffic is:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo iptables -A INPUT -s **YOUR_BLOCK_PRODUCER_INTERNAL_IP** -p tcp --dport **YOUR_RELAY_LISTENING_PORT** -j ACCEPT\nsudo iptables -L -v\nsudo service netfilter-persistent save\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an example of the aforementioned command created with the example set for ",(0,r.kt)("inlineCode",{parentName:"p"},"release-preprod"),":"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo iptables -A INPUT -s 192.168.1.75 -p tcp --dport 3132 -j ACCEPT\nsudo iptables -L -v\nsudo service netfilter-persistent save\n"))),(0,r.kt)("h2",{id:"verify-the-mithril-signer-deployment"},"Verify the Mithril signer deployment"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"There is a delay of ",(0,r.kt)("inlineCode",{parentName:"p"},"2")," epochs between the registration of the signer node and its ability to generate individual signatures. This delay is further explained in the ",(0,r.kt)("a",{parentName:"p",href:"https://mithril.network/doc/mithril/mithril-protocol/certificates"},"Mithril certificate chain in depth")," documentation."),(0,r.kt)("p",{parentName:"admonition"},"Once this delay has passed, you should be able to observe your ",(0,r.kt)("inlineCode",{parentName:"p"},"PoolId")," listed in some of the certificates accessible on the ",(0,r.kt)("a",{parentName:"p",href:"https://mithril.network/explorer"},(0,r.kt)("inlineCode",{parentName:"a"},"Mithril Explorer")),".")),(0,r.kt)("h3",{id:"verify-your-signer-is-registered"},"Verify your signer is registered"),(0,r.kt)("p",null,"After installing the Mithril signer, you can verify that your node is registered by checking your Mithril signer node logs. "),(0,r.kt)("p",null,"First, download the script into the desired directory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"wget https://mithril.network/doc/scripts/verify_signer_registration.sh\n")),(0,r.kt)("p",null,"Make the script executable:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"chmod +x verify_signer_registration.sh\n")),(0,r.kt)("p",null,"Finally, execute the script:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"PARTY_ID=**YOUR_PARTY_ID** AGGREGATOR_ENDPOINT=**YOUR_AGGREGATOR_ENDPOINT** ./verify_signer_registration.sh\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an example command:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"PARTY_ID=pool1hp72sauk0g0yqm4dzllz0pz6j93gewhllkzphn4hykkfmne43y AGGREGATOR_ENDPOINT=https://aggregator.release-preprod.api.mithril.network/aggregator ./verify_signer_registration.sh\n"))),(0,r.kt)("p",null,"If your signer is registered, you should see this message:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},">> Congrats, your signer node is registered!\n")),(0,r.kt)("p",null,"Otherwise, you should see this error message:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},">> Oops, your signer node is not registered. Party ID not found among the signers registered at epoch 430.\n")),(0,r.kt)("h3",{id:"verify-your-signer-contributes-with-individual-signatures"},"Verify your signer contributes with individual signatures"),(0,r.kt)("p",null,"After waiting for two epochs, you will be able to verify that your signer is contributing with individual signatures."),(0,r.kt)("p",null,"First, download the script into the desired directory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"wget https://mithril.network/doc/scripts/verify_signer_signature.sh\n")),(0,r.kt)("p",null,"Make the script executable:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"chmod +x verify_signer_signature.sh\n")),(0,r.kt)("p",null,"Finally, execute the script:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"PARTY_ID=**YOUR_PARTY_ID** AGGREGATOR_ENDPOINT=**YOUR_AGGREGATOR_ENDPOINT** ./verify_signer_signature.sh\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Here is an example of the aforementioned command created with the example set for ",(0,r.kt)("inlineCode",{parentName:"p"},"release-preprod"),":"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"PARTY_ID=pool1hp72sauk0g0yqm4dzllz0pz6j93gewhllkzphn4hykkfmne43y AGGREGATOR_ENDPOINT=https://aggregator.release-preprod.api.mithril.network/aggregator ./verify_signer_signature.sh\n"))),(0,r.kt)("p",null,"If your signer is contributing, you should see this message:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},">> Congrats, you have signed this certificate: https://aggregator.release-preprod.api.mithril.network/aggregator/certificate/el3p289b03a223244285b2ls10839846ae7a69f1e8362824a383f376f93f723f !\n")),(0,r.kt)("p",null,"Otherwise, you should see this error message:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},">> Oops, your party id was not found in the last 20 certificates. Please try again later.\n")))}h.isMDXComponent=!0},81900:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>m});var n=a(87462),r=(a(67294),a(3905)),i=a(74866),l=a(85162);const o={unlisted:!0,hide_title:!0,hide_table_of_contents:!0},p=void 0,s={unversionedId:"networks-matrix",id:"networks-matrix",title:"networks-matrix",description:"Here is an updated list of all Mithril networks, including their configurations and current statuses:",source:"@site/root/networks-matrix.md",sourceDirName:".",slug:"/networks-matrix",permalink:"/doc/next/networks-matrix",draft:!1,editUrl:"https://github.com/input-output-hk/mithril/edit/main/docs/root/networks-matrix.md",tags:[],version:"current",frontMatter:{unlisted:!0,hide_title:!0,hide_table_of_contents:!0}},d={},m=[{value:"<code>release-mainnet</code>",id:"release-mainnet",level:2},{value:"<code>release-preprod</code>",id:"release-preprod",level:2},{value:"<code>pre-release-preview</code>",id:"pre-release-preview",level:2},{value:"<code>testing-preview</code>",id:"testing-preview",level:2}],u={toc:m},c="wrapper";function h(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Here is an updated list of all ",(0,r.kt)("strong",{parentName:"p"},"Mithril networks"),", including their configurations and current statuses:"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Last update: 07/21/2023")),(0,r.kt)(i.Z,{mdxType:"Tabs"},(0,r.kt)(l.Z,{value:"mainnet",label:"Mainnet",default:!0,mdxType:"TabItem"},(0,r.kt)("h2",{id:"release-mainnet"},(0,r.kt)("inlineCode",{parentName:"h2"},"release-mainnet")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Information"),(0,r.kt)("th",{parentName:"tr",align:null},"-"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Mithril network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"release-mainnet"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"mainnet"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano magic id")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"-"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Supported")),(0,r.kt)("td",{parentName:"tr",align:null},"Yes \u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Status")),(0,r.kt)("td",{parentName:"tr",align:null},"Beta \ud83d\udfe2")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Aggregator endpoint")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://aggregator.release-mainnet.api.mithril.network/aggregator")," ",(0,r.kt)("a",{parentName:"td",href:"https://aggregator.release-mainnet.api.mithril.network/aggregator"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Genesis verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/genesis.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/genesis.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader adapter type")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"cardano-chain"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader address")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/era.addr")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/era.addr"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/era.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/era.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Build from")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Latest release")," ",(0,r.kt)("a",{parentName:"td",href:"https://github.com/input-output-hk/mithril/releases/latest"},"\u2197\ufe0f")))))),(0,r.kt)(l.Z,{value:"preprod",label:"Preprod",mdxType:"TabItem"},(0,r.kt)("h2",{id:"release-preprod"},(0,r.kt)("inlineCode",{parentName:"h2"},"release-preprod")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Information"),(0,r.kt)("th",{parentName:"tr",align:null},"-"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Mithril network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"release-preprod")," ",(0,r.kt)("a",{parentName:"td",href:"https://mithril.network/explorer?aggregator=https%3A%2F%2Faggregator.release-preprod.api.mithril.network%2Faggregator"},"\ud83d\udd0e"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"preprod"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano magic Id")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"1"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Supported")),(0,r.kt)("td",{parentName:"tr",align:null},"Yes \u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Status")),(0,r.kt)("td",{parentName:"tr",align:null},"Release \ud83d\udfe2")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Aggregator endpoint")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://aggregator.release-preprod.api.mithril.network/aggregator")," ",(0,r.kt)("a",{parentName:"td",href:"https://aggregator.release-preprod.api.mithril.network/aggregator"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Genesis verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/genesis.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/genesis.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader adapter type")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"cardano-chain"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader address")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/era.addr")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/era.addr"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/era.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/era.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Build from")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Latest release")," ",(0,r.kt)("a",{parentName:"td",href:"https://github.com/input-output-hk/mithril/releases/latest"},"\u2197\ufe0f")))))),(0,r.kt)(l.Z,{value:"preview",label:"Preview",mdxType:"TabItem"},(0,r.kt)("h2",{id:"pre-release-preview"},(0,r.kt)("inlineCode",{parentName:"h2"},"pre-release-preview")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Information"),(0,r.kt)("th",{parentName:"tr",align:null},"-"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Mithril network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"pre-release-preview")," ",(0,r.kt)("a",{parentName:"td",href:"https://mithril.network/explorer?aggregator=https%3A%2F%2Faggregator.pre-release-preview.api.mithril.network%2Faggregator"},"\ud83d\udd0e"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"preview"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano magic Id")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"2"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Supported")),(0,r.kt)("td",{parentName:"tr",align:null},"Yes \u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Status")),(0,r.kt)("td",{parentName:"tr",align:null},"Pre-release \ud83d\udfe0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Aggregator endpoint")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://aggregator.pre-release-preview.api.mithril.network/aggregator")," ",(0,r.kt)("a",{parentName:"td",href:"https://aggregator.pre-release-preview.api.mithril.network/aggregator"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Genesis verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/genesis.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/genesis.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader adapter type")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"cardano-chain"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader address")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/era.addr")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/era.addr"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/era.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/era.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Build from")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Latest pre-release")," ",(0,r.kt)("a",{parentName:"td",href:"https://github.com/input-output-hk/mithril/releases?q=pre"},"\u2197\ufe0f"))))),(0,r.kt)("br",null),(0,r.kt)("h2",{id:"testing-preview"},(0,r.kt)("inlineCode",{parentName:"h2"},"testing-preview")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u26a0\ufe0f For devs only")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Information"),(0,r.kt)("th",{parentName:"tr",align:null},"-"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Mithril network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"testing-preview")," ",(0,r.kt)("a",{parentName:"td",href:"https://mithril.network/explorer?aggregator=https%3A%2F%2Faggregator.testing-preview.api.mithril.network%2Faggregator"},"\ud83d\udd0e"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano network")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"preview"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Cardano magic Id")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"2"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Supported")),(0,r.kt)("td",{parentName:"tr",align:null},"Yes \u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Status")),(0,r.kt)("td",{parentName:"tr",align:null},"Unstable \ud83d\udd34")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Aggregator endpoint")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://aggregator.testing-preview.api.mithril.network/aggregator")," ",(0,r.kt)("a",{parentName:"td",href:"https://aggregator.testing-preview.api.mithril.network/aggregator"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Genesis verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/genesis.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/genesis.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader adapter type")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"cardano-chain"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader address")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.addr")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.addr"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Era reader verification key")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.vkey")," ",(0,r.kt)("a",{parentName:"td",href:"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.vkey"},"\u2197\ufe0f"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Build from")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Main branch")," ",(0,r.kt)("a",{parentName:"td",href:"https://github.com/input-output-hk/mithril/tree/main"},"\u2197\ufe0f"))))))),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"In this documentation, we use the following generic identifiers:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_CARDANO_NETWORK**")," You need to replace this with the name of the network that runs on your Cardano node (eg, ",(0,r.kt)("inlineCode",{parentName:"li"},"preprod"),")"),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_AGGREGATOR_ENDPOINT**")," You need to replace this with the endpoint of an aggregator that runs on the Cardano network you are targeting (eg, ",(0,r.kt)("inlineCode",{parentName:"li"},"https://aggregator.release-preprod.api.mithril.network/aggregator"),")"),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_GENESIS_VERIFICATION_KEY**")," You need to replace this with the genesis verification key URL that runs on the Cardano network you are targeting (eg, ",(0,r.kt)("inlineCode",{parentName:"li"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/genesis.vkey"),")"),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_ERA_READER_ADAPTER_TYPE**")," You need to replace this with the era reader adapter type used by the Mithril network you are targeting (eg, ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-chain"),")"),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_ERA_READER_ADDRESS**")," You need to replace this with the era reader address URL used by the Mithril network you are targeting (eg, ",(0,r.kt)("inlineCode",{parentName:"li"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/address.addr"),")"),(0,r.kt)("li",{parentName:"ul"},"*",(0,r.kt)("strong",{parentName:"li"},"*YOUR_ERA_READER_VERIFICATION_KEY**")," You need to replace this with the era reader verification key URL used by the Mithril network you are targeting (eg, ",(0,r.kt)("inlineCode",{parentName:"li"},"https://raw.githubusercontent.com/input-output-hk/mithril/main/TEST_ONLY_era.vkey"),")"))))}h.isMDXComponent=!0},66182:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/files/signer-deployment-naive-6f2cc44fb5738b30cc3b5c370042845a.jpg"},34310:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/files/signer-deployment-production-691bb17c165b4da09c46222bc71c06ac.jpg"},50532:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/signer-deployment-naive-6f2cc44fb5738b30cc3b5c370042845a.jpg"},82997:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/signer-deployment-production-691bb17c165b4da09c46222bc71c06ac.jpg"}}]);