laconic-webflow-website/blog/what-is-a-proof.html

710 lines
90 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html data-wf-page="669ac798eea89addcd56e444" data-wf-site="669696d6af77a83985da8ffd" lang="en" data-wf-collection="669ac798eea89addcd56e416" data-wf-item-slug="what-is-a-proof"><head><meta charset="utf-8"/><title>What Is a Proof and Why Do You Need One? | Laconic Network</title><meta content="Laconic Network Blog" name="description"/><meta content="What Is a Proof and Why Do You Need One? | Laconic Network" property="og:title"/><meta content="Laconic Network Blog" property="og:description"/><meta content="../images/what-is-a-proof.png" property="og:image"/><meta content="What Is a Proof and Why Do You Need One? | Laconic Network" property="twitter:title"/><meta content="Laconic Network Blog" property="twitter:description"/><meta content="../images/what-is-a-proof.png" property="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="Webflow" name="generator"/><link href="../css/laconic-staging.webflow.ac960b332.min.css" rel="stylesheet" type="text/css"/><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="../images/favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="../images/app-icon.png" rel="apple-touch-icon"/><script>
(function() {
const storedTheme = localStorage.getItem('theme');
const root = document.documentElement;
if (storedTheme) {
root.setAttribute('data-theme', storedTheme);
} else {
root.setAttribute('data-theme', 'dark');
}
})();
</script></head><body><div aria-hidden="true" class="page-wrapper"><div class="global-styles w-embed"><style>
:root {
color-scheme: dark;
--duration-normal: 0.525s;
--duration-fast: 0.262s;
--ease: cubic-bezier(0.165, 0.84, 0.44, 1);
--ease-button: cubic-bezier(0.3, 1, 0.8, 1);
--normal-transition: var(--duration-fast) var(--ease);
--main-padding-top: max(13px, 0.6770833333vw);
--main-padding-side: max(16px, 2.96875vw);
--header-height: max(70px, 3.6979166667vw);
--header-height-mobile: 79px;
--logo: url("path-to-dark-theme-image.jpg");
}
:root[data-theme="light"] {
color-scheme: light;
--theme--color-accent: #0000f4;
--theme--color-accent-boke: #0000f4;
--theme--color-black: #fbfbfb;
--theme--color-white: #040404;
--theme--color-grey: #565656;
--theme--color-grey-light: #8e8e8e;
--theme--color-grey-lightness: #dedede;
--logo: url("path-to-dark-theme-image.jpg");
}
::selection {
background-color: #0000f4;
color: #040404;
}
body {
transition: all var(--normal-transition);
}
/**
*** Light Mode Styles
**/
html[data-theme="light"] .button.benefits,
html[data-theme="light"] .button.primary,
html[data-theme="light"] .button.community{
color: var(--theme--color-black);
}
html[data-theme="light"] .noise-component {
opacity: 0.35;
}
html[data-theme="light"] .benefits_ball {
mix-blend-mode: darken;
background-color: var(--theme--color-black);
box-shadow: 0 4px 115px 15px #0000f4, 0 0 70px 20px var(--theme--color-black),
inset -39px -20px 100px rgba(0, 0, 244, 0.73);
}
html[data-theme="light"] .hero_gradient,
html[data-theme="light"] .section_blog-hero,
html[data-theme="light"] .section_blog-post-hero {
background-image: linear-gradient( 180deg, var(--theme--color-black) 1%, var(--theme--color-black) 65%);
}
html[data-theme="light"] ._404_background-gradient,
html[data-theme="light"] .product-hero_gradient,
html[data-theme="light"] .partner-hero_gradient {
visibility: hidden;
}
html[data-theme="light"] .footer_toggle {
justify-content: flex-end;
}
html[data-theme="light"] .network_feature-image {
-webkit-filter: invert(100%);
filter: invert(100%);
}
html[data-theme="light"] {
.network_desktop-image,
.network_mobile-image,
.community-hero_mobile-image,
.app_desktop-image,
.app_mobile-image,
.product-hero_video-container,
.partner-hero_video-container,
.partner-hero_mobile-image-container,
.opportunities_image,
.opportunities_mobile-image {
mix-blend-mode: darken;
}
}
html[data-theme="light"] .product-hero_mobile-image-container {
mix-blend-mode: darken;
-webkit-filter: brightness(110%);
filter: brightness(110%);
}
.product-hero_gradient,
.partner-hero_gradient {
background: linear-gradient(
180deg,
rgba(0, 0, 244, 0.9) 1.63%,
rgba(0, 0, 244, 0) 99.89%
);
}
.community-hero_gradient{
background: linear-gradient(180deg, rgba(0, 0, 244, .9) 1.63%, rgba(0, 0, 244, 0) 99.89%);
}
.events_gradient{
background: linear-gradient(180deg, hsla(0, 0%, 90%, 0), hsla(0, 0%, 100%, .39) 51%, hsla(0, 0%, 95%, 0) 89.23%);
}
.stack_gradient {
position: absolute;
right: 0;
bottom: max(300px, 30.7291666667vw);
left: 0;
opacity: 0.4;
z-index: -1;
margin-left: 0;
background: linear-gradient(
180deg,
hsla(0, 0%, 90%, 0),
hsla(0, 0%, 95%, 0.5) 48.91%,
hsla(0, 0%, 95%, 0) 89.23%
);
width: 100%;
height: max(180px, 18.2291666667vw);
content: "";
pointer-events: none;
-webkit-user-select: none;
user-select: none;
}
.partner-hero_video {
-webkit-mask-size: 250% 100%;
mask-size: 250% 100%;
-webkit-mask-position: center center;
mask-position: center center;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-image: radial-gradient(
ellipse,
#030303 40%,
rgba(3, 3, 3, 0) 85%,
rgba(3, 3, 3, 0) 100%
);
mask-image: radial-gradient(
ellipse,
#030303 40%,
rgba(3, 3, 3, 0) 85%,
rgba(3, 3, 3, 0) 100%
);
}
@keyframes noise_grain {
0% {
-webkit-transform: translate(20%, -15%);
transform: translate(20%, -15%);
}
10% {
-webkit-transform: translate(-20%, -15%);
transform: translate(-20%, -15%);
}
20% {
-webkit-transform: translate(20%, -5%);
transform: translate(20%, -5%);
}
30% {
-webkit-transform: translate(-20%, -5%);
transform: translate(-20%, -5%);
}
40% {
-webkit-transform: translate(20%, 5%);
transform: translate(20%, 5%);
}
50% {
-webkit-transform: translate(-20%, 5%);
transform: translate(-20%, 5%);
}
60% {
-webkit-transform: translate(20%, 15%);
transform: translate(20%, 15%);
}
70% {
-webkit-transform: translate(-20%, 15%);
transform: translate(-20%, 15%);
}
80% {
-webkit-transform: translate(20%, 5%);
transform: translate(20%, 5%);
}
90% {
-webkit-transform: translate(-20%, 5%);
transform: translate(-20%, 5%);
}
100% {
-webkit-transform: translate(20%, -5%);
transform: translate(20%, -5%);
}
}
.social_subheader:before{
display: block;
position: absolute;
-webkit-transform: translate(-220%, -50%);
transform: translate(-220%, -50%);
border-bottom: max(2px, .1041666667vw) solid blue;
width: max(15px, 1.25vw);
height: max(15px, .9375vw);
content: "";
}
.opportunities_block:nth-child(2n) {
grid-template-columns: auto max(50px, 15.625vw);
}
.opportunities_block:nth-child(2n) .opportunities_image {
grid-area: 1 / 2 / 2 / 3;
}
.opportunities_block:last-child {
padding-bottom: max(60px, 6.25vw);
border-bottom: max(1px, 0.0520833333vw) solid var(--theme--color-grey-light);
}
.opportunities_block:not(:first-child) {
margin-top: max(30px, 4.4791666667vw);
}
.stack_item:before {
padding-top: 0.4166666667vw;
font-size: max(10px, 0.625vw);
content: "0" counter(custom) " ";
}
.section_app div:first-child {
position: relative;
width: 67.7083333333vw;
}
.section_app .app_container {
display: flex;
z-index: 2;
}
.legal_rich-text li::marker {
color: var(--theme--color-accent);
}
.benefits_benefit-icon:before {
position: absolute;
top: 0;
left: 0;
opacity: 0.5;
background: linear-gradient(
134.38deg,
var(--theme--color-white) 4.91%,
var(--theme--color-black) 108.92%
);
content: "";
z-index: -1;
width: max(38px, 1.9791666667vw);
height: max(27px, 1.40625vw);
}
.blog-post_rich-text li::before {
content: "";
position: absolute;
border-radius: 50%;
height: 8px !important;
width: 8px !important;
margin-top: max(8px, 0.78125vw) !important;
background: var(--theme--color-accent) !important;
left: 0 !important;
}
.blog-post_rich-text li::marker {
content: "";
}
.section_hero:before {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
z-index: -1;
background: linear-gradient(
0deg,
var(--theme--color-black) 15%,
rgba(9, 9, 121, 0) 50%,
var(--theme--color-black) 100%
),
linear-gradient(
90deg,
var(--theme--color-black) 0,
hsla(0, 0%, 100%, 0) 10%,
hsla(0, 0%, 100%, 0) 50%,
hsla(0, 0%, 100%, 0) 90%,
var(--theme--color-black) 100%
);
width: 101%;
height: 101%;
aspect-ratio: 16/9;
content: "";
pointer-events: none;
}
.section_hero:after {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
z-index: -1;
background: linear-gradient(
0deg,
var(--theme--color-black) 15%,
rgba(9, 9, 121, 0) 50%,
var(--theme--color-black) 100%
),
linear-gradient(
90deg,
var(--theme--color-black) 0,
hsla(0, 0%, 100%, 0) 10%,
hsla(0, 0%, 100%, 0) 50%,
hsla(0, 0%, 100%, 0) 90%,
var(--theme--color-black) 100%
);
width: 101%;
height: 101%;
content: "";
pointer-events: none;
}
.section_404:before {
background: radial-gradient(
ellipse farthest-corner at center center,
rgba(4, 4, 4, 0.25) 55%,
var(--theme--color-black) 0
);
width: 120%;
height: 115%;
filter: blur(max(40px, 4.1666666667vw));
will-change: filter, transform;
aspect-ratio: 16 / 9;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: -1;
content: "";
pointer-events: none;
}
html[data-theme="light"] .section_404:before {
width: 120%;
height: 115%;
background: linear-gradient(
0deg,
var(--theme--color-black) 15%,
rgba(9, 9, 121, 0) 50%,
var(--theme--color-black) 100%
);
}
/* Get rid of top margin on first element in any rich text element */
.w-richtext > :not(div):first-child,
.w-richtext > div:first-child > :first-child {
margin-top: 0 !important;
}
/* Get rid of bottom margin on last element in any rich text element */
.w-richtext > :last-child,
.w-richtext ol li:last-child,
.w-richtext ul li:last-child {
margin-bottom: 0 !important;
}
.blog_card-title {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.blog_preview,
.blog_summary,
.latest-news_summary {
display: -webkit-box;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.blog_link-text:before,
.nav_link:before,
.footer_link:before {
position: absolute;
top: 100%;
left: 0;
right: 0;
opacity: 0;
width: 0;
background-image: repeating-linear-gradient(
0deg,
currentcolor,
currentcolor 100%,
transparent 0,
transparent 0,
currentcolor 0
),
repeating-linear-gradient(
90deg,
currentcolor,
currentcolor 100%,
transparent 0,
transparent 0,
currentcolor 0
),
repeating-linear-gradient(
currentcolor,
currentcolor 100%,
transparent 0,
transparent 0,
currentcolor 0
),
repeating-linear-gradient(
270deg,
currentcolor,
currentcolor 100%,
transparent 0,
transparent 0,
currentcolor 0
);
background-position: 0 0, 0 0, 100% 0, 0 100%;
background-repeat: no-repeat;
background-size: 0 100%, 100% 0, 0 100%, 100% 2px;
height: max(1px, 0.0520833333vw);
-webkit-animation: link_border__mvlME var(--duration-normal) linear infinite;
animation: link_border__mvlME var(--duration-normal) linear infinite;
content: "";
pointer-events: none;
transition: all var(--duration-normal) var(--ease);
}
.nav_link:hover::before,
.blog_link-text:hover::before,
.footer_link:hover::before {
width: 100%;
opacity: 1;
transition: all var(--duration-normal) var(--ease);
}
.blog-hero_card:hover .blog_hero-card-image-container {
-webkit-filter: brightness(125%);
filter: brightness(125%);
transition: -webkit-filter var(--duration-normal);
transition: filter var(--duration-normal);
transition: filter var(--duration-normal),
-webkit-filter var(--duration-normal);
}
.blog_card:hover .blog_card-image-container {
-webkit-filter: brightness(125%);
filter: brightness(125%);
transition: -webkit-filter var(--duration-normal);
transition: filter var(--duration-normal);
transition: filter var(--duration-normal),
-webkit-filter var(--duration-normal);
}
.blog_link:hover .blog_link-icon {
-webkit-transform: rotate(45deg) scale(1.15);
transform: rotate(45deg) scale(1.15);
}
.blog_link-icon {
transition: transform var(--normal-transition),
-webkit-transform var(--normal-transition);
}
@media (min-width: 1600px) {
.blog_grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 990px) {
.social_subheader:before{
visibility:hidden;
}
.opportunities_block:last-child {
border-bottom: unset;
padding-bottom: 5.3333333333vw;
}
.opportunities_block:not(:first-child) {
margin-top: max(60px, 5.859375vw);
}
.blog_link-text:before,
.nav_link:before {
top: 105%;
}
html[data-theme="light"] .nav_menu {
background-image: linear-gradient(
180deg,
var(--theme--color-black) 1%,
var(--theme--color-black) 65%
); /* Use decimal value for opacity with higher specificity */
}
.section_hero:before,
.section_hero:after {
display: none;
}
.section_app div:first-child {
width: 100%;
min-height: max(340px, 50.6666666667vw);
order: 2;
}
}
</style></div><div class="noise-component"></div><header class="nav_component"><nav class="nav_container"><a aria-label="Go to Homepage" href="/" class="nav_logo-wrapper w-inline-block"><svg xmlns="http://www.w3.org/2000/svg" width="601" height="106" viewBox="0 0 601 106" fill="none" class="nav_logo"><path fill-rule="evenodd" clip-rule="evenodd" d="M18.2894 55.7848C30.5189 43.5558 38.0888 26.6671 38.0854 8.02048C38.09 5.48949 37.9502 2.98667 37.6724 0.514839L0.560059 0.518218L0.561185 71.8255C0.557804 80.4687 3.85339 89.1148 10.4451 95.7065C17.0374 102.298 25.6897 105.598 34.3346 105.593L34.3323 105.596L105.642 105.597L105.64 68.4797C103.173 68.2076 100.671 68.0673 98.134 68.0667C79.4918 68.069 62.6026 75.6383 50.373 87.8673C41.474 96.5432 27.2059 96.5449 18.4167 87.7557C9.6332 78.9722 9.62925 64.6996 18.2894 55.7848ZM97.9446 8.23121C87.6956 -2.01727 71.0447 -2.02122 60.7923 8.23121C50.5398 18.4831 50.5438 35.134 60.7923 45.3819C71.0464 55.636 87.6922 55.6343 97.9446 45.3819C108.197 35.13 108.199 18.4848 97.9446 8.23121Z" fill="var(--theme--color-white)"></path><path d="M165.931 98.1547H206.814V86.3139H179.596V7.9399H165.931V98.1547Z" fill="var(--theme--color-white)"></path><path d="M262.275 7.9399H239.613L215.925 98.1547H230.046L235.968 75.6011H265.236L271.158 98.1547H285.962L262.275 7.9399ZM238.815 64.3243L250.659 17.6379H251.114L262.502 64.3243H238.815Z" fill="var(--theme--color-white)"></path><path d="M331.202 42.9061H347.145C347.145 17.195 338.832 6.14364 319.472 6.14364C299.087 6.14364 290.319 20.1272 290.319 52.9428C290.319 85.871 299.087 99.9673 319.472 99.9673C338.832 99.9673 347.145 89.2539 347.259 64.3322H331.316C331.202 83.8415 328.81 88.6905 319.472 88.6905C308.767 88.6905 306.148 81.586 306.262 52.9428C306.262 24.4122 308.881 17.3077 319.472 17.4204C328.81 17.4204 331.202 22.4954 331.202 42.9061Z" fill="var(--theme--color-white)"></path><path d="M388.201 6.14421C408.927 6.25746 417.81 20.3532 417.81 53.056C417.81 85.7589 408.927 99.8551 388.201 99.9678C367.361 100.081 358.478 85.9843 358.478 53.056C358.478 20.1278 367.361 6.03152 388.201 6.14421ZM374.421 53.056C374.421 81.5866 377.154 88.6911 388.201 88.6911C399.133 88.6911 401.867 81.5866 401.867 53.056C401.867 24.4128 399.133 17.3083 388.201 17.4215C377.154 17.5342 374.421 24.6387 374.421 53.056Z" fill="var(--theme--color-white)"></path><path d="M447.595 98.042L433.929 98.1547V7.9399H457.958L480.393 81.4649H480.62V7.9399H494.283V98.1547H471.738L447.823 18.9913H447.595V98.042Z" fill="var(--theme--color-white)"></path><path d="M528.434 7.9399H514.77V98.1547H528.434V7.9399Z" fill="var(--theme--color-white)"></path><path d="M584.502 42.9061H600.447C600.447 17.195 592.131 6.14364 572.771 6.14364C552.391 6.14364 543.618 20.1272 543.618 52.9428C543.618 85.871 552.391 99.9673 572.771 99.9673C592.131 99.9673 600.447 89.2539 600.56 64.3322H584.615C584.502 83.8415 582.113 88.6905 572.771 88.6905C562.066 88.6905 559.451 81.586 559.564 52.9428C559.564 24.4122 562.184 17.3077 572.771 17.4204C582.113 17.4204 584.502 22.4954 584.502 42.9061Z" fill="var(--theme--color-white)"></path></svg></a><div class="nav_menu"><div class="nav_links"><a data-w-id="fbd3c3c8-569b-7ba4-52f1-12d65e5c9f1e" href="/products" class="nav_link">Products</a><a data-w-id="fbd3c3c8-569b-7ba4-52f1-12d65e5c9f20" href="/partners" class="nav_link">Partners</a><a data-w-id="fbd3c3c8-569b-7ba4-52f1-12d65e5c9f22" href="/community" class="nav_link">Community</a><a data-w-id="fbd3c3c8-569b-7ba4-52f1-12d65e5c9f24" href="/blog" class="nav_link">Blog</a></div><a href="https://github.com/cerc-io/stack-orchestrator" target="_blank" class="button mobile-nav w-button">GET STARTED</a><div class="hide-on-desktop"><div class="nav_secondary-menu"><div class="theme-toggle_wrapper"><div id="toggle-label" class="footer_toggle-label">Dark Mode</div><a id="theme-toggle" href="#" class="footer_toggle w-inline-block"><div class="footer_toggle-circle"></div></a></div><div class="nav_social"><a aria-label="Visit our Twitter" href="https://twitter.com/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M7.55016 21.3548c9.05434 0 14.00814-7.4471 14.00814-13.9033 0-.20936-.0047-.42337-.0141-.63273.9637-.69168 1.7953-1.54843 2.4558-2.52999-.8975.39631-1.8504.65515-2.8261.76765 1.0274-.61122 1.7966-1.57142 2.1652-2.7026-.9665.56851-2.0235.96954-3.1257 1.18591-.7426-.78315-1.7244-1.30169-2.7937-1.47544-1.0693-.17376-2.1665.00695-3.122.51417-.9554.50722-1.7159 1.31271-2.1639 2.29194-.4479.97922-.5584 2.07764-.3143 3.12543-1.95701-.09747-3.87156-.60206-5.61952-1.48104-1.74795-.87898-3.29029-2.11274-4.52701-3.62129-.62857 1.07562-.820913 2.34843-.53794 3.55975C1.418 7.66457 2.15506 8.7235 3.19641 9.41483c-.78178-.02463-1.54643-.23354-2.230785-.60947v.06048c-.0007 1.12879.392475 2.22296 1.112685 3.09656.72021.8736 1.72301 1.4727 2.83794 1.6955-.72419.1966-1.48427.2253-2.22141.0837.31461.9708.92673 1.8198 1.75093 2.4287.8242.6088 1.81935.9471 2.84657.9676-1.74392 1.3596-3.89817 2.0971-6.11578 2.0936C.783287 19.2309.390399 19.2069 0 19.1598c2.25286 1.4345 4.87353 2.1964 7.55016 2.195Z" fill="url(#:r34:)"></path><defs><linearGradient id=":r34:" x1="12" y1="2" x2="12" y2="21.3548" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a><a aria-label="Join us on Discord" href="https://discord.com/invite/ukhbBemyxY" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33 26" class="footer_social-icon"><path d="M27.936 2.155A26.571 26.571 0 0 0 21.219.002a.1.1 0 0 0-.108.053c-.29.533-.611 1.229-.837 1.775a24.314 24.314 0 0 0-7.544 0 18.232 18.232 0 0 0-.85-1.775.105.105 0 0 0-.107-.053 26.497 26.497 0 0 0-6.717 2.153.097.097 0 0 0-.044.04C.733 8.8-.438 15.245.136 21.61c.003.03.02.06.043.08 2.823 2.142 5.557 3.443 8.24 4.305a.105.105 0 0 0 .116-.039c.635-.896 1.2-1.84 1.686-2.834a.11.11 0 0 0-.057-.15 17.773 17.773 0 0 1-2.574-1.269.111.111 0 0 1-.01-.181c.172-.134.345-.274.51-.414a.1.1 0 0 1 .107-.015c5.4 2.549 11.248 2.549 16.585 0a.099.099 0 0 1 .108.013c.165.141.338.282.512.416a.111.111 0 0 1-.01.181c-.821.497-1.676.916-2.575 1.267a.11.11 0 0 0-.055.152 22.854 22.854 0 0 0 1.684 2.833.103.103 0 0 0 .116.04c2.696-.862 5.43-2.163 8.253-4.305a.11.11 0 0 0 .043-.079c.688-7.358-1.153-13.75-4.88-19.415a.085.085 0 0 0-.042-.04Zm-16.909 15.58c-1.625 0-2.965-1.543-2.965-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.991 1.556 2.965 3.438 0 1.895-1.314 3.438-2.966 3.438Zm10.966 0c-1.626 0-2.966-1.543-2.966-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.992 1.556 2.966 3.438 0 1.895-1.301 3.438-2.966 3.438Z" fill="currentColor"></path></svg></a><a aria-label="Visit our Youtube Channel" href="https://www.youtube.com/@Laconic-Network" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" class="footer_social-icon"><path d="M 15 4 C 10.814 4 5.3808594 5.0488281 5.3808594 5.0488281 L 5.3671875 5.0644531 C 3.4606632 5.3693645 2 7.0076245 2 9 L 2 15 L 2 15.001953 L 2 21 L 2 21.001953 A 4 4 0 0 0 5.3769531 24.945312 L 5.3808594 24.951172 C 5.3808594 24.951172 10.814 26.001953 15 26.001953 C 19.186 26.001953 24.619141 24.951172 24.619141 24.951172 L 24.621094 24.949219 A 4 4 0 0 0 28 21.001953 L 28 21 L 28 15.001953 L 28 15 L 28 9 A 4 4 0 0 0 24.623047 5.0546875 L 24.619141 5.0488281 C 24.619141 5.0488281 19.186 4 15 4 z M 12 10.398438 L 20 15 L 12 19.601562 L 12 10.398438 z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></a><a aria-label="Find us on Reddit" href="https://www.reddit.com/r/LaconicNetwork/" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M24 12c0 6.6274-5.3726 12-12 12-6.62742 0-12-5.3726-12-12C0 5.37258 5.37258 0 12 0c6.6274 0 12 5.37258 12 12Zm-5.7544-1.7544C19.214 10.2456 20 11.0316 20 12c0 .7158-.4351 1.3333-1.0105 1.614.0281.1684.0421.3369.0421.5193 0 2.6947-3.1298 4.8702-7.0035 4.8702-3.87371 0-7.00353-2.1755-7.00353-4.8702 0-.1824.01403-.3649.0421-.5333-.61754-.2807-1.03859-.8842-1.03859-1.6 0-.9684.78596-1.7544 1.75438-1.7544.46316 0 .89825.1965 1.20702.4912 1.20702-.88419 2.87719-1.43156 4.74382-1.4877l.8843-4.18246c.028-.08421.0701-.15438.1403-.19649.0702-.0421.1544-.05614.2386-.0421l2.9053.61754c.1965-.42105.6175-.70175 1.1087-.70175.6878 0 1.2492.5614 1.2492 1.24912s-.5614 1.24912-1.2492 1.24912c-.6736 0-1.221-.53333-1.2491-1.19298l-2.5965-.54737-.8 3.74737c1.8246.07018 3.4807.63158 4.6737 1.4877.3088-.3088.7298-.4912 1.207-.4912ZM9.24913 12c-.68772 0-1.24912.5614-1.24912 1.2491 0 .6877.5614 1.2491 1.24912 1.2491s1.24917-.5614 1.24917-1.2491c0-.6877-.56145-1.2491-1.24917-1.2491Zm2.76487 5.4596c.4772 0 2.1053-.0561 2.9614-.9123.1264-.1263.1264-.3228.0281-.4631-.1263-.1263-.3368-.1263-.4631 0-.5474.5333-1.6843.7298-2.5123.7298-.8281 0-1.979-.1965-2.5123-.7298-.12632-.1263-.33685-.1263-.46316 0-.12632.1263-.12632.3368 0 .4631.8421.8422 2.48416.9123 2.96136.9123Zm1.4878-4.2105c0 .6877.5614 1.2491 1.2491 1.2491.6877 0 1.2491-.5614 1.2491-1.2491C16 12.5614 15.4386 12 14.7509 12c-.6877 0-1.2491.5614-1.2491 1.2491Z" fill="url(#:r35:)" clip-rule="evenodd" fill-rule="evenodd"></path><defs><linearGradient id=":r35:" x1="12" y1="2" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a><a aria-label="Chat with us on Telegram" href="https://t.me/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M24 12c0 6.6274-5.3726 12-12 12-6.62742 0-12-5.3726-12-12C0 5.37258 5.37258 0 12 0c6.6274 0 12 5.37258 12 12ZM12.43 8.85893c-1.1672.48547-3.49986 1.49027-6.99811 3.01437-.56806.2259-.86563.4469-.89272.663-.04578.3652.41154.509 1.0343.7048.08471.0267.17248.0543.26247.0835.6127.1992 1.43689.4322 1.86535.4414.38865.0084.82244-.1518 1.30135-.4807 3.26856-2.2063 4.95576-3.32149 5.06166-3.34553.0747-.01696.1783-.03829.2485.02408.0701.06235.0632.18045.0558.21215-.0453.1931-1.8405 1.8621-2.7695 2.7258-.2896.2692-.495.4602-.537.5038-.0941.0977-.19.1902-.2821.279-.5692.5487-.99609.9602.0236 1.6322.49.3229.8822.5899 1.2733.8563.4273.291.8534.5812 1.4047.9426.1405.092.2746.1877.4053.2808.4972.3545.9438.6729 1.4957.6221.3206-.0295.6519-.331.8201-1.2302.3975-2.1253 1.1789-6.7299 1.3595-8.62743.0158-.16624-.0041-.379-.02-.4724-.016-.09339-.0494-.22646-.1708-.32497-.1438-.11666-.3658-.14126-.465-.13952-.4514.00795-1.1438.24874-4.4764 1.63485Z" fill="url(#:r36:)" clip-rule="evenodd" fill-rule="evenodd"></path><defs><linearGradient id=":r36:" x1="12" y1="2" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a><a aria-label="Find us on LinkedIn" href="https://www.linkedin.com/company/laconic-network/" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M3e-7 2.00509C3e-7 1.47331.21125.963308.587278.58728.963305.211253 1.47331.00000267 2.00509.00000267H21.9927c.2636-.00043042.5246.05112313.7682.15170933.2436.100586.4649.248229.6514.434476.1864.186247.3343.40744.4352.650912.1008.24348.1526.50446.1525.76799V21.9927c.0003.2636-.0514.5247-.1521.7683-.1007.2436-.2485.4649-.4348.6513-.1863.1865-.4076.3343-.6511.4352-.2436.1008-.5046.1526-.7682.1525H2.00509c-.2634 0-.52423-.0519-.76757-.1527-.243336-.1009-.464424-.2487-.650628-.435-.186204-.1863-.333875-.4074-.434576-.6508-.1007015-.2434-.15245901-.5043-.1523157-.7677V2.00509ZM9.49964 9.15055h3.24986v1.63195C13.2185 9.84437 14.4185 9 16.2218 9c3.4571 0 4.2764 1.8687 4.2764 5.2975v6.3512h-3.4986v-5.5702c0-1.9527-.4691-3.0545-1.6603-3.0545-1.6528 0-2.34 1.188-2.34 3.0545v5.5702H9.49964V9.15055Zm-6 11.34875h3.49963V9H3.49964v11.4993ZM7.5 5.24946c.0066.29964-.04672.59758-.15683.87634s-.27479.53271-.48437.74696c-.20959.21426-.45986.38449-.73612.5007-.27627.11622-.57296.17609-.87268.17609s-.59641-.05987-.87268-.17609c-.27626-.11621-.52653-.28644-.73612-.5007-.20958-.21425-.37426-.4682-.48437-.74696C3.04672 5.84704 2.9934 5.5491 3 5.24946c.01295-.58816.25569-1.14787.67624-1.55925.42054-.41139.98546-.64175 1.57376-.64175s1.15322.23036 1.57376.64175c.42055.41138.66329.97109.67624 1.55925Z" fill="currentColor" clip-rule="evenodd" fill-rule="evenodd"></path></svg></a><a aria-label="Visit our Facebook page" href="https://www.facebook.com/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M24 12c0-6.62742-5.3726-12-12-12C5.37258 0 0 5.37258 0 12c0 5.9895 4.3882 10.954 10.125 11.8542v-8.3855H7.07812V12H10.125V9.35625c0-3.0075 1.7916-4.66875 4.5326-4.66875 1.3125 0 2.6862.23437 2.6862.23437V7.875h-1.5132c-1.4906 0-1.9556.92508-1.9556 1.875V12h3.3281l-.532 3.4687H13.875v8.3855C19.6118 22.954 24 17.9895 24 12Z" fill="url(#:r37:)" clip-rule="evenodd" fill-rule="evenodd"></path><defs><linearGradient id=":r37:" x1="12" y1="2" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a><a aria-label="Follow us on Instagram" href="https://instagram.com/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M12 2.16094c3.2063 0 3.5859.01406 4.8469.07031 1.1719.05156 1.8047.24844 2.2265.4125.5579.21563.961.47813 1.3782.89531.4218.42188.6797.82032.8953 1.37813.164.42187.3609 1.05937.4125 2.22656.0562 1.26562.0703 1.64531.0703 4.84685 0 3.2063-.0141 3.586-.0703 4.8469-.0516 1.1719-.2485 1.8047-.4125 2.2266-.2156.5578-.4782.9609-.8953 1.3781-.4219.4219-.8203.6797-1.3782.8953-.4218.1641-1.0593.3609-2.2265.4125-1.2656.0562-1.6453.0703-4.8469.0703-3.20625 0-3.58594-.0141-4.84687-.0703-1.17188-.0516-1.80469-.2484-2.22657-.4125-.55781-.2156-.96093-.4781-1.37812-.8953-.42188-.4219-.67969-.8203-.89531-1.3781-.16407-.4219-.36094-1.0594-.4125-2.2266-.05625-1.2656-.07032-1.6453-.07032-4.8469 0-3.20622.01407-3.58591.07032-4.84685.05156-1.17188.24843-1.80469.4125-2.22656.21562-.55781.47812-.96094.89531-1.37813.42187-.42187.82031-.67968 1.37812-.89531.42188-.16406 1.05938-.36094 2.22657-.4125C8.41406 2.175 8.79375 2.16094 12 2.16094ZM12 0C8.74219 0 8.33438.0140625 7.05469.0703125 5.77969.126563 4.90313.332812 4.14375.628125 3.35156.9375 2.68125 1.34531 2.01563 2.01562 1.34531 2.68125.9375 3.35156.628125 4.13906.332812 4.90313.126563 5.775.0703125 7.05.0140625 8.33437 0 8.74219 0 12c0 3.2578.0140625 3.6656.0703125 4.9453.0562505 1.275.2624995 2.1516.5578125 2.911.309375.7921.717185 1.4625 1.387505 2.1281.66562.6656 1.33593 1.0781 2.12343 1.3828.76407.2953 1.63594.5015 2.91094.5578 1.27969.0562 1.6875.0703 4.9453.0703 3.2578 0 3.6656-.0141 4.9453-.0703 1.275-.0563 2.1516-.2625 2.911-.5578.7875-.3047 1.4578-.7172 2.1234-1.3828.6656-.6656 1.0781-1.336 1.3828-2.1235.2953-.764.5016-1.6359.5578-2.9109.0563-1.2797.0703-1.6875.0703-4.9453 0-3.25782-.014-3.66564-.0703-4.94532-.0562-1.275-.2625-2.15157-.5578-2.91094-.2953-.79688-.7031-1.46719-1.3734-2.13282C21.3188 1.35 20.6484.9375 19.8609.632812 19.0969.3375 18.225.13125 16.95.075 15.6656.0140625 15.2578 0 12 0Z" fill="url(#:r38:)"></path><path d="M12 5.83594c-3.40312 0-6.16406 2.76094-6.16406 6.16406 0 3.4031 2.76094 6.1641 6.16406 6.1641 3.4031 0 6.1641-2.761 6.1641-6.1641 0-3.40312-2.761-6.16406-6.1641-6.16406Zm0 10.16246c-2.20781 0-3.99844-1.7906-3.99844-3.9984 0-2.20781 1.79063-3.99844 3.99844-3.99844 2.2078 0 3.9984 1.79063 3.9984 3.99844 0 2.2078-1.7906 3.9984-3.9984 3.9984Z" fill="url(#:r38:)"></path><path d="M19.8469 5.59238c0 .79688-.6469 1.43907-1.4391 1.43907-.7969 0-1.439-.64688-1.439-1.43907 0-.79687.6468-1.43906 1.439-1.43906s1.4391.64688 1.4391 1.43906Z" fill="url(#:r38:)"></path><defs><linearGradient id=":r38:" x1="12" y1="2" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a></div><div>Laconic: Offshore Hosting Made Easy</div></div></div></div><a id="nav-button" aria-label="Toggle mobile menu" href="#" class="nav_mobile-button w-inline-block"><div data-is-ix2-target="1" class="nav_burger" data-w-id="fbd3c3c8-569b-7ba4-52f1-12d65e5c9f29" data-animation-type="lottie" data-src="../images/laconic-20menu.json" data-loop="0" data-direction="1" data-autoplay="0" data-renderer="svg" data-duration="0" data-ix2-initial-state="0"></div></a><a href="https://github.com/cerc-io/stack-orchestrator" target="_blank" class="button nav w-button">GET STARTED</a></nav></header><main class="main"><section class="section_blog-post-hero"><div class="padding-global"><div class="container-large"><div class="blog-hero_component"><h1 class="heading-style-h2">What Is a Proof and Why Do You Need One?</h1><div class="blog_byline"><div>9.20.2022</div><div>-</div><div class="blog_author"><div>BY — </div><div>Stefan Adolf</div></div></div><div class="blog_categories hero"><div class="blog_category-chip w-condition-invisible"><div>Developers</div></div><div class="blog_category-chip"><div>Insights</div></div><div class="blog_category-chip"><div>Product</div></div><div class="blog_category-chip w-condition-invisible"><div>News</div></div><div class="blog_category-chip w-condition-invisible"><div>Partners</div></div></div></div></div></div></section><section class="section_blog-post"><div class="padding-global"><div class="container-large"><div class="blog-post_image-container"><img src="../images/what-is-a-proof.png" loading="lazy" alt="" sizes="(max-width: 479px) 93vw, (max-width: 991px) 94vw, 68vw" srcset="../images/what-is-a-proof-p-500.png 500w, ../images/what-is-a-proof-p-800.png 800w, ../images/what-is-a-proof.png 1100w" class="blog-post_image"/></div></div><div class="container-medium"><div class="blog-post_component"><div class="blog-post_container"><div class="blog-post_rich-text w-richtext"><p>Decentralized apps rely heavily on blockchain state to display current and historical values like an account&#x27;s balance, its NFT holdings, or current exchange rates on DEXes. Projects like The Graph or Covalent make blockchain data accessible, chain indexers like Etherscan provide historical information about the chain&#x27;s state, and RPC providers like Infura or Alchemy allow wallet extensions like Metamask to connect to their full-node infrastructure. However, unless you run your very own full-node you cannot prove that any value provided by these sources truly resembles the chain state they represent. In short: relying on external, centralized services imposes a trust risk. However, the way Ethereum stores data allows trusting the chain state data without trusting the provider itself, thanks to proofs. This is how it works.</p><h2>Ethereum&#x27;s storage model</h2><p>Ethereum uses a tree-based storage model that contains each account&#x27;s balance and the storage for contract-based accounts. All values are wrapped in a traversable hash trie structure - a <a target="_blank" href="https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/">Patricia Merkle Trie</a> - that allows creating cryptographic hash proofs for each tree node. The state root hash of a block represents the complete state of all accounts and contracts at a given block height, aka the <strong><em>world</em></strong><em> </em><strong><em>state</em></strong>. Block producers execute new transactions on their local state copy and bundle the resulting new state root hash and a list of all executed transactions into a new block.</p><p>Light Ethereum clients cannot verify the current chain&#x27;s state since they&#x27;re not keeping a full copy of the world state. Full nodes can rebuild the state tree by executing every transaction since genesis, and then constantly update it as new blocks arrive. To save storage space they only keep the most recent chain states and hence cannot respond to state queries from the past, i.e. they&#x27;re not able to determine an account&#x27;s balance older than - depending on the node&#x27;s settings - 64 blocks. That&#x27;s sufficient to create proofs about the current state, though.</p><h2>Cryptographic proofs on hash trees</h2><p>Merkle trees use hashes of their nodes&#x27; values as keys to guarantee their content integrity. To build a simple binary Merkle tree, a prover starts by computing a hash over a node <strong><em>L</em></strong>&#x27;s content <strong><em>h(L)</em></strong>. Next, they compute the hash over <strong><em>h(L)</em></strong> and the hash of a sibling content node <strong><em>K</em>: <em>h(h(K)+h(L))</em></strong>. Using this hash as a key they create a new node <strong><em>KL</em></strong> with <strong><em>h(K)</em></strong> and <strong><em>h(L)</em></strong> as children and find another node<strong> <em>IJ</em></strong> at the same tree level to create a new parent node that hashes all values of the underlying tree structure: <strong><em>h(IJ + KL) = h(h(h(I) + h(J)) + h(h(K) + h(L)))</em></strong>. This process is repeated until all nodes are combined to a single root hash. Since each parent node keeps a hash of its children, it&#x27;s impossible to change anything down the tree without affecting the tree&#x27;s root node.</p><p>To prove that a certain base value has been incorporated into a Merkle tree&#x27;s root, one collects the hashes of sibling nodes at each level of the tree. A prover successively computes their hash sums to finally recreate the root hash, thereby proving the inclusion of the node&#x27;s value.</p><p>A simple way of storing binary Merkle trees in a flat key/value database structure is with <a target="_blank" href="https://en.wikipedia.org/wiki/Radix_tree">radix tries</a>. To store a node, one splits its hexadecimal hash key into its nibbles (the hex characters) and create subdirectories for each of them. A node with the key <strong><em>0xcafe</em></strong> would end up in a folder structure like <strong><em>c/a/f/e/value</em></strong>. Looking up a node requires traversing the directory structure along the key&#x27;s nibbles down to the last nibble&#x27;s directory where the node&#x27;s value will be stored. While simple to understand this approach is far too inefficient to store large tree data structures like Ethereum&#x27;s world state. The network instead uses Patricia Merkle Tries that add some complexity to the data structure by introducing branch-, extension-, leaf- and null-nodes but are way more efficient to store and traverse. Additionally, a Recursive Length Prefix (<a target="_blank" href="https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/">RLP</a>) encoding is used to serialize nested arrays and data structures.</p><h2>Proving account state</h2><p>Ethereum&#x27;s state trie consists of a mapping between account addresses and their state, defined by their current <strong><em>nonce</em></strong> and <strong><em>balance</em></strong> and in the case of contract accounts a <strong><em>storageRoot</em></strong> key that points to a position in the dedicated contract storage trie and their binary code hash. Just using a block&#x27;s <strong><em>stateRoot</em></strong> one can look up an account&#x27;s current state at that height using a full node&#x27;s LevelDB (Geth&#x27;s default storage database). Our examples are using an archive node of Ethereum&#x27;s recently launched <a target="_blank" href="https://sepolia.dev/">Sepolia testnet</a> because it&#x27;s still small enough to be synced to a developer&#x27;s machine.</p><p><code>const { SecureTrie } = require(&quot;merkle-patricia-tree&quot;);<br/>const {<br/>  toBuffer,<br/>  bufferToHex,<br/>  keccak256,<br/>  Account,<br/>} = require(&quot;ethereumjs-util&quot;);<br/>const Web3 = require(&quot;web3&quot;);<br/><br/>const web3 = new Web3(&quot;http://127.0.0.1:8545&quot;);<br/>const db = new Level(&quot;.ethereum/sepolia/geth/chaindata&quot;);<br/><br/>async function getState(address, blockNumber) {<br/>  const block = await web3.eth.getBlock(blockNumber);<br/>  const trie = new SecureTrie(db, toBuffer(block.stateRoot));<br/><br/>  //retrieves the account node&#x27;s *value*<br/>  const rawValue = await trie.get(toBuffer(address));<br/>  const account = Account.fromRlpSerializedAccount(rawValue);<br/>  console.log(account);<br/>}</code></p><p><strong><em>getState(&quot;0xe127a39da6ea2d7b1979372ae973a20bab08a80a&quot;, 1432400)</em> </strong>yields:</p><p><code>account Account {<br/>  nonce: &lt;BN: 2&gt;,<br/>  balance: &lt;BN: 1f3d52b3c4f92e45d&gt;,<br/>  stateRoot: &lt;Buffer 56 e8 1f 17 1b cc 55 a6 ff 83 45 e6 92 c0 f8 6e 5b 48 e0 1b 99 6c ad c0 01 62 2f b5 e3 63 b4 21&gt;,<br/>  codeHash: &lt;Buffer c5 d2 46 01 86 f7 23 3c 92 7e 7d b2 dc c7 03 c0 e5 00 b6 53 ca 82 27 3b 7b fa d8 04 5d 85 a4 70&gt;<br/>}</code></p><p>The provided account is an EOA, hence the <strong><em>codeHash</em></strong> value corresponds to <strong><em>keccak256([])</em></strong> (another expression of a null value) and <strong><em>stateRoot</em></strong> is the hash of an RLP encoded zero:<strong> <em>keccak256(rlp.encode(0))</em></strong>.</p><p>To create a proof of the account node&#x27;s value against a block&#x27;s state root you walk down the patricia trie starting at the block&#x27;s <strong><em>stateRoot</em></strong> node, resolve the paths on the trie&#x27;s branch and extension nodes according to the signposts expressed by the leaf node&#x27;s nibbles until the wanted leaf node is reached. On the way we&#x27;re keeping track of all nodes we see while traversing the path. More details about <a target="_blank" href="https://github.com/ethereumjs/ethereumjs-monorepo/blob/cfd7b7754490b072a035cceaba59c3dfb517effd/packages/trie/src/trie/trie.ts#L154">the traversal can be found here</a>. We&#x27;re using only high level methods to show proof creation here:</p><p><code>const { SecureTrie } = require(&quot;merkle-patricia-tree&quot;);<br/>const { toBuffer, keccak256 } = require(&quot;ethereumjs-util&quot;);<br/><br/>const db = new Level(&quot;.ethereum/sepolia/geth/chaindata&quot;);<br/>const trie = new SecureTrie(db, toBuffer(block.stateRoot));<br/><br/>//create a proof by finding the path on our own:<br/>const { node: accountNode, stack } = await trie.findPath(<br/>  keccak256(toBuffer(address))<br/>);<br/>const proof = stack.map((stackElem) =&gt; {<br/>  return stackElem.serialize();<br/>});<br/><br/>//or by using a trie&#x27;s convenience method:<br/>const proof = await SecureTrie.createProof(trie, toBuffer(address));<br/><br/>//or by using the ethereum node&#x27;s RPC interface<br/>const { accountProof: proof } = await web3.eth.getProof(<br/>  address,<br/>  [0],<br/>  block.number<br/>);</code></p><p>All three proofs contain the same array of RLP encoded proof nodes, with our account node at its end:</p><p><code>[<br/>  &quot;0xf90211a078400dd6bd6f6cc13cdde5b707bdb6b9802fbd11809cba8aab2ee72f6920bbf3a0d88879eb6f43ea2d9c07538601e041aa46d64c87df68296a552ad12f8e5bebc0a044d40ac93c1bce308feda36a7712a38d9508087f04e612b1411bc57f80fa77a8a0b92c5fc0dcbc4a7982563c3667b940117770965e5f447578e4bde4fefcbb6d5aa0bc555b313ac90177e117dc10917581dad616770625e0956feb0df75a4be2ce63a0bd19008ae54cf1af36e59d7c92c553693dd468a0ef86c89401d01fc84aa4b751a0ee549b7ab8dd9a565ee6507bb46b9033e57b3a07541a4085763207911633367ca05652bd80f5b970a09c2090c38b13afa1772f3d97422c9a16548acdf629c35113a0a2e78f2d0da2d7218535b94bd69c4fad4425ff3bb22304d722185cf99dac2596a0a9470e771ae9cec5535b057948e68c4c38d8b8c1c2d8ed180d8f5244c63e422ea0726d10a2a5c85b156105414e75591611d896b8aaebd7fc92535845445a8baa81a0fdfb5aa2c35136eab67c3539d3ba34648bb8542b57e745976d52bca263ab19d7a01eafa4a1f59d28009a03b24d9a11c878faa78fe7ef3ecc4ef8891a77fea3fa35a02c980b0a841d5ec1978ae63adf7ba2727ac125f792f545cb0146d8df46adbdbfa052b97e4692fd69b4bebc6ceca258032319b07aca2ee62b504285031670fbc073a02c415e41b6bf838a8b742123fda110703ffdedea8834bb5113ae26f81887668e80&quot;,<br/>  &quot;0xf90211a098e0b7071d2b8d890cca479dba9f5b697d639d70d51f0312c5b8a27afc31a23da060759f93f482f66b233480a4cd060372567752b9dae507045b266600ab9b290da0c35bb5b2aae7eb8bc75a9de125daab9caa7d6d39e403153c9b34e51dcde46f78a097a4c1ba8ac42378481754eac9306b62d3d176602098820cb87e3c7f4091734da074b2785ca9199d0c68e2fa6dd01dcc24791887616adf8043cda56651cff25e87a00937963d57bc119144ebeff9bb99dcbef11aed563fd41818aaf0de89d15364b3a000ba5def8acd7c1c2af85ef49bc5d144fa1ceef93e81e9e64ad6457ab92cb569a069cd4b3ac6b03b1928f50840f81086ff0c819d1cbd445db0e5c306cfce9c0728a0a78339d0b9405da5a7943a6ac97b9585767a6f9f0e481b5e197d8fd820ac1cfaa019e1319ade8f1c2254dcef0b68483240044bc6bee2ea8197de895eb427068b1aa0ef36884df92b5769e521c6c0feaead503a8d70d11f493b3e6c8170ac917ced92a079c1ffdaa2a8d4ddacac77f47b43f1553c634300d23a8003574ec90874547cbaa0de4f130f1fd52baf5229e3871394b6f0562c64576039c6c38d06c695b7d87b07a09668798efa8c1e9b860d9f4a49b65db83c22fefd92f703a5875b87c7ae11bdf4a087ca8f145dbc9ad7f88468dbec0627d77ced63a508b4d7a5d28439e89c6be8e4a04fdb75be4fce4d76e41578f0bbcfdc2ded74d59855c9f3afc73c3659b9e28aa980&quot;,<br/>  &quot;0xf90211a058d99773cf489bd86bac2c6452c20cc7056f3505d7f96d83480cf85336d0da85a07dc4216585f73a213fb1828076cf7d93d8ce95e1981a5c8eb11d7166af8433eba0f85f31a95a1f83516719ae596266afdc529aa4ff9af8f0f6c1d7da6751f07d70a0f1371490b8ef31ce814673e9ecf0f498f2ec9eedcd554e93162d5c0e99e77d69a01d9709211cc089eba15fe3c052539203d11235b219e1c72e0172c9bec1d317bea09e907ad084233149719b5c6f8b4777a617b41744a0c3e9f6ef002970465a0656a044f3abc34546455ba2ed3d64ead41c734d5f56c240f8f8adfd971179538ca0efa08403716832691c8867b1366421b703925ff28e45d6f4360f898b70461e29d4eda0d8f4711ffe7bc79040b2f397523786a67d72814e8af9b65c9e03c318bb0eba48a0db84d2a268e67d6e45af7cd18a92fab1df496180e9ba8f0f0b620ab6344457cba0d01707094316206d689d80ed2684cda3aadd72ee2d4efbe1437bb194aa0adc87a0355e0e203341ac995bf2d90937f1ce807a13624e9d3831476f3205838b84f191a083961a9b498b791ee8e6a110a87aca2f2cea629df0827f4fbd168567d7246207a05d312338764151dc1936485637367ad9d9c440b4b0dde368dec4dbd5aaf51f4ea076b77567690221701e2edfff06f1c84a25b3181e4c8aa3bed2b3e3797a883564a0975b63f1be5615a4a68ec7f313abc0784def11a352975c40e886e03df95f764e80&quot;,<br/>  &quot;0xf9013180a0944968a4a8c7ba1e91cbb2414471a67f16c74e2ef6ac87447af0402520aed9c88080a03f3e1fed1008e242b89ce5b56106a091f946826c539f23ecee74c5b36b5d38cca041b58c41b5435e10c9b9f6b1f1bdf3d5e0294dfcfbf59b7a8c80475249e1d9e6a0d0b42862dcb175e47bf17614bd251b17cdab2710ba13175fd9b8c17afdc0893ba0ff4dc7ee613a7805802e50d39c3c8d8b35db63ceda7371502c5d119eca0a7b1780a0cd328766d44f930edc3a32ae5fd2a791f0de4dbabe014c4be77fc63b4b427310a0c20a6a1812f18d0c446408f90b09d0b592a07c45d06e780b49c6ad68e7c92bc5a084688c931305a75246f9d527a07483cff6e9ffbe4746a22ca65e07d3b3c6045f8080a0515f82b6e34b4713edead2652f266fdcea3729d64217113db564e918a9b1ed408080&quot;,<br/>  &quot;0xf8518080a06b91f274ef06ab455966416f6bb3779519bf72c68e85ec4b61ff8b99aa73a1818080a0937ee4540dc495eaa3cd61e12a4f6158a6be147d71ac3955a50ecd080e9732698080808080808080808080&quot;,<br/>  &quot;0xf8709e3e0484bbc22108bc77412e65255ce0387dc7c6a8d1917625ddb60ccbd98fb84ff84d028901f3d52b3c4f92e45da056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470&quot;<br/>]</code></p><p>To verify this proof one doesn&#x27;t need to have access to a full state tree at that block height. It&#x27;s sufficient to know (and trust, e.g. by running a light node) the proof block&#x27;s <strong><em>stateRoot</em></strong>:</p><p><code>const { SecureTrie } = require(&quot;merkle-patricia-tree&quot;);<br/>const { toBuffer, keccak256, Account } = require(&quot;ethereumjs-util&quot;);<br/><br/>// look Ma, no ethereum node needed<br/>// @param stateRoot hexString: the block&#x27;s stateRoot<br/>async function verifyAccountProof(address, proof, stateRoot) {<br/>  const proofBufs = proof.map((p) =&gt; toBuffer(p));<br/>  //build a new trie using only the proof nodes. They will hash towards the block&#x27;s stateRoot<br/>  const proofTrie = await SecureTrie.fromProof(proofBufs);<br/><br/>  //the account node can also be retrieved from the partial trie:<br/>  const accNodeRaw = await proofTrie.get(keccak256(toBuffer(address)));<br/>  const account = Account.fromRlpSerializedAccount(accNodeRaw);<br/><br/>  console.log(&quot;proven value&quot;, account);<br/>  const valid = await proofTrie.checkRoot(toBuffer(stateRoot));<br/>  //or: const valid = bufferToHex(proofTrie.root) == stateRoot;<br/>  return valid;<br/>}</code></p><h2>Proving contract state</h2><p>Proofs over contract state are created accordingly. They are rooted at the contract account&#x27;s own <strong><em>stateRoot</em></strong> member variable that points to the mutable root of the contract&#x27;s storage trie. Storage slots are addressed by their position hash as outlined in the <a target="_blank" href="https://docs.soliditylang.org/en/v0.8.15/internals/layout_in_storage.html#mappings-and-dynamic-arrays">Solidity documentation</a> and are stored as leaf nodes in the storage trie. To simplify this procedure, we&#x27;re going to use <strong><em>eth_getProof</em></strong> calls here as described in <a target="_blank" href="https://eips.ethereum.org/EIPS/eip-1186">EIP-1186</a> and supported by all major chain node implementations and service providers. Lets prove <a target="_blank" href="https://sepolia.etherscan.io/address/0xF492600AeD292b1B94A1ba0CD29fB6ed6d6ab872">this contract</a>&#x27;s <strong><em>greeting</em></strong> to be &quot;<strong><em>Hello, Hardhat!</em></strong>&quot; at Sepolia block number <strong><em>1391140 </em></strong>:</p><p><code>pragma solidity ^0.8.0;<br/><br/>contract Greeter {<br/>    string private greeting;<br/><br/>    constructor(string memory _greeting) {<br/>      greeting = _greeting;<br/>    }<br/><br/>    function setGreeting(string memory _greeting) public {<br/>      greeting = _greeting;<br/>    }<br/>}</code></p><p>Now, lets create a proof of its storage slot 0 (the string variable <strong><em>greeting</em></strong> ):</p><p><code>const { bufferToHex } = require(&quot;ethereumjs-util&quot;);<br/>const { SecureTrie } = require(&quot;merkle-patricia-tree&quot;);<br/>const Web3 = require(&quot;web3&quot;);<br/><br/>const web3 = new Web3(&quot;http://127.0.0.1:8545&quot;);<br/><br/>const proveContractStorage = async (blockNumber) =&gt; {<br/>  const proof = await web3.eth.getProof(<br/>    &quot;0xf492600aed292b1b94a1ba0cd29fb6ed6d6ab872&quot;, //the contract&#x27;s address on Sepolia<br/>    [0], //the first storage slot<br/>    blockNumber<br/>  );<br/>  console.log(proof.storageProof);<br/>  const value = web3.utils.hexToAscii(proof.storageProof[0].value);<br/>  console.log(value);<br/><br/>  const proofBufs = proof.storageProof[0].proof.map(toBuffer);<br/>  const proofTrie = await SecureTrie.fromProof(proofBufs);<br/>  const valid = bufferToHex(proofTrie.root) == proof.storageHash;<br/>  console.log(valid);<br/>};[<br/>  {<br/>    key: &#x27;0x0&#x27;,<br/>    value: &#x27;0x48656c6c6f2c204861726468617421000000000000000000000000000000001e&#x27;,<br/>    proof: [<br/>      &#x27;0xf8518080a0e2a22c03c4f21673563d55cbad16de4c4affc9a54c3eea063ce358ccd6d02c4c8080808080808080a0fc47ec7aea920817d850c758a8fd61ecc89b967b2fe8d9ec6d00feedeb0a7d658080808080&#x27;,<br/>      &#x27;0xf843a0390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563a1a048656c6c6f2c204861726468617421000000000000000000000000000000001e&#x27;<br/>    ]<br/>  }<br/>]<br/>Hello, Hardhat!<br/>true</code></p><h3>A non trivial example</h3><p>Creating proofs over nested structures, dynamic types like strings, or deeply buried storage slots is slightly harder because you have to be familiar with Solidity&#x27;s <a target="_blank" href="https://docs.soliditylang.org/en/v0.8.15/internals/layout_in_storage.html">storage layout</a>. To demonstrate that, here is a non-trivial example to prove that Jimmy Fallon owned <a target="_blank" href="https://opensea.io/assets/ethereum/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d/599">Bored Ape #599</a> at block height <a target="_blank" href="https://etherscan.io/block/13572667">13572667</a> as he claimed during his Tonight Show <a target="_blank" href="https://www.youtube.com/watch?v=5zi12wrh5So&amp;t=222s">in January 22</a>. The Bored Apes NFT contract inherits from OpenZeppelin&#x27;s legacy V3 <a target="_blank" href="https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.2/contracts/token/ERC721/ERC721.sol#L36">enumerable ERC721 contract</a>. The data structure storing ownership information about a single token is the private <strong><em>_tokenOwners</em></strong> member struct that maps a token id to an index onto another dynamic array of key value mappings.</p><p>To prove the ownership storage values we need to take a look at the contract&#x27;s <strong><em>ownerOf</em></strong> implementation and its related structs. Here&#x27;s a summary of the relevant parts of the <a target="_blank" href="https://etherscan.deth.net/address/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d#code">full BAYC code base</a>:</p><p><code>library EnumerableMap {<br/>  struct MapEntry {<br/>    bytes32 _key;<br/>    bytes32 _value;<br/>  }<br/><br/>  struct Map {<br/>    MapEntry[] _entries;<br/>    // Position of the entry defined by a key in the `entries` array, plus 1<br/>    // because index 0 means a key is not in the map.<br/>    mapping (bytes32 =&gt; uint256) _indexes;<br/>  }<br/><br/>  struct UintToAddressMap {<br/>    Map _inner;<br/>  }<br/><br/>  function _get(Map storage map, bytes32 key) private view returns (bytes32) {<br/>    uint256 keyIndex = map._indexes[key];<br/>    require(keyIndex != 0, &quot;EnumerableMap: nonexistent key&quot;); // Equivalent to contains(map, key)<br/>    return map._entries[keyIndex - 1]._value; // All indexes are 1-based<br/>  }<br/><br/>  function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {<br/>    return address(uint160(uint256(_get(map._inner, bytes32(key)))));<br/>  }<br/>  //...<br/>}<br/><br/>contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {<br/><br/>  // Mapping from holder address to their (enumerable) set of owned tokens<br/>  mapping (address =&gt; EnumerableSet.UintSet) private _holderTokens;<br/><br/>  // Enumerable mapping from token ids to their owners<br/>  EnumerableMap.UintToAddressMap private _tokenOwners;<br/><br/>  function ownerOf(uint256 tokenId) public view virtual override returns (address) {<br/>    return _tokenOwners.get(tokenId, &quot;ERC721: owner query for nonexistent token&quot;);<br/>  }<br/>  //...<br/>}</code></p><p>The index mapping <em>_tokenOwners</em> is the contract&#x27;s third storage member (the 1st one being part of the ERC-165 implementation) and it implicitly points to the <strong><em>Map</em></strong> struct via <strong><em>UintToAddressMap.inner </em></strong>, occupying two storage slots. By applying Solidity&#x27;s <a target="_blank" href="https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html#mappings-and-dynamic-arrays">layout rules for dynamic arrays</a>, the storage slot&#x27;s address of the enumeration index that points to the current owner of token #599 can be computed as <strong><em>const indexSlot = web3.utils.soliditySha3(599, 3);</em></strong>. Querying that storage slot&#x27;s value by <strong><em>web3.eth.getStorageAt(baycAddress, indexSlot, blockNumber)</em></strong> yields the index <strong><em>0x258</em></strong> at the given block height. Considering that the <strong><em>Map._entries</em></strong> array starts at the contract&#x27;s third slot, it takes two slots to store one <strong><em>MapEntry</em></strong> and the indexes are 1-based we can resolve the map&#x27;s <strong><em>_value</em></strong> member that carries the token owner&#x27;s address like so: </p><p><code>soliditySha3(2) + (0x258 * 2) - 2 + 1</code></p><p>With that we can construct two storage proofs for the index and the owner&#x27;s address:</p><p><code>const baycAddress = &quot;0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d&quot;;<br/>const blockNumber = 13572667;<br/><br/>const indexSlot = web3.utils.soliditySha3(599, 3);<br/>// -&gt; 0x7e2616eb7a75f68a32624f502cf2cabc166c302900bbdc790c2fb85cea316a21<br/>const indexValue = await web3.eth.getStorageAt(<br/>  baycAddress,<br/>  indexSlot,<br/>  blockNumber<br/>); //0x258<br/><br/>const bnIndex = ethers.BigNumber.from(indexValue);<br/>const valueSlot = ethers.BigNumber.from(web3.utils.soliditySha3(2))<br/>  .add(bnIndex.mul(2))<br/>  .sub(2)<br/>  .add(1);<br/>// -&gt; 0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5f7d<br/><br/>const proof = await web3.eth.getProof(<br/>  baycAddress,<br/>  [indexSlot, valueSlot],<br/>  blockNumber<br/>);</code></p><p>To prove the <em>value</em> of the yielded proof, we can:</p><p><code>async function validateStorage(proof, slot, proofIdx) {<br/>  const proofBufs = proof.storageProof[proofIdx].proof.map(toBuffer);<br/>  const pTrie = await SecureTrie.fromProof(proofBufs);<br/>  const valid = pTrie.checkRoot(toBuffer(proof.storageHash));<br/>  const rlpNode = await pTrie.get(toBuffer(web3.utils.keccak256(slot)));<br/>  console.log(&quot;content at slot&quot;, slot, bufferToHex(rlp.decode(rlpNode)));<br/>  return valid;<br/>}<br/><br/>console.log(await validateStorage(proof, indexSlot, 0));<br/>console.log(await validateStorage(proof, valueSlot.toHexString(), 1));content at slot 0x9f82913e56c1ea296cd5a3c46bc89a4073098f41767359e4c3742445923985c7 0x0258<br/>true<br/>content at slot 0xd4790f3899b463e8194660196b97cf3ff9c47008d83ca7c0e51ce406d3c784e5 \<br/>0x0394451c1238cec1e825229e692aa9e428c107d8 (&lt;- Jimmy Fallon&#x27;s address)<br/>true</code></p><h2>Validating proofs inside smart contracts</h2><p>These have been client side examples, but proofs can also be validated inside Solidity contracts, e.g. to prove historical chain information that&#x27;s not available to the contract itself. A good example can be seen at Lido Finance&#x27;s <a target="_blank" href="https://github.com/lidofinance/curve-merkle-oracle">trustless ETH/stETH price pool oracles</a> that receives price reports as a combination of block header, account and state proofs. Since proofs are submitted <a target="_blank" href="https://github.com/lidofinance/curve-merkle-oracle/blob/main/contracts/StableSwapStateOracle.sol#L295">as memory variables</a>, price updates <a target="_blank" href="https://etherscan.io/tx/0xb24e20813e08f75e12e29da53f7f6c7e5dca7be68f3d3247edd4de572c527df4">are relatively cheap</a>. Here&#x27;s a contract that&#x27;s built on <a target="_blank" href="https://github.com/lidofinance/curve-merkle-oracle/tree/main/contracts">Lido&#x27;s primitives</a> and verifies any given state proof. It&#x27;s also <a target="_blank" href="https://goerli.etherscan.io/address/0x52e357f616a13089435be73e20cffb788eb4c928#code">deployed on Görli</a>:</p><p><code>// SPDX-License-Identifier: MIT<br/>pragma solidity 0.6.12;<br/>pragma experimental ABIEncoderV2;<br/><br/>import &quot;./StateProofVerifier.sol&quot;;<br/>import {RLPReader} from &quot;solidity-rlp/contracts/RLPReader.sol&quot;;<br/><br/>contract ProofVerifier {<br/>    using RLPReader for bytes;<br/>    using RLPReader for RLPReader.RLPItem;<br/>    using StateProofVerifier for StateProofVerifier.Account;<br/><br/>    /*<br/>    struct Account {<br/>      bool exists;<br/>      uint256 nonce;<br/>      uint256 balance;<br/>      bytes32 storageRoot;<br/>      bytes32 codeHash;<br/>    }<br/><br/>    struct SlotValue {<br/>      bool exists;<br/>      uint256 value;<br/>    }<br/>    */<br/><br/>    function extractAccountFromProof(<br/>      address _address,<br/>      bytes32 _stateRootHash,<br/>      bytes memory _proofRlpBytes<br/>    ) public pure returns (StateProofVerifier.Account memory account) {<br/>      RLPReader.RLPItem[] memory proofs = _proofRlpBytes.toRlpItem().toList();<br/>      bytes32 addressHash = keccak256(abi.encodePacked(_address));<br/><br/>      account = StateProofVerifier.extractAccountFromProof(<br/>          addressHash,<br/>          _stateRootHash,<br/>          proofs<br/>      );<br/>    }<br/><br/>    function extractSlotValueFromProof(<br/>      bytes32 _slotHash,<br/>      bytes32 _storageRootHash,<br/>      bytes memory _proofRlpBytes<br/>    ) public pure returns (StateProofVerifier.SlotValue memory slotValue) {<br/>      RLPReader.RLPItem[] memory proofs = _proofRlpBytes.toRlpItem().toList();<br/>      slotValue = StateProofVerifier.extractSlotValueFromProof(<br/>          _slotHash,<br/>          _storageRootHash,<br/>          proofs<br/>      );<br/>    }<br/>}</code></p><p>Continuing with the proof of Jimmy Fallon&#x27;s Bored Ape, this is how you would prepare RLP encoded versions of the proof&#x27;s node array as required by the contract&#x27;s method interface:</p><p><code>//converts an array of rlp encoded proofs to an rlp encoded array of proofs.<br/>const rlpEncodeProof = (proof) =&gt; {<br/>  const rlpDecodedProofs = proof.map((p) =&gt; rlp.decode(toBuffer(p)));<br/>  return rlp.encode(rlpDecodedProofs);<br/>};<br/><br/>const rlpAccountProof = rlpEncodeProof(proof.accountProof);<br/>const indexStorageProof = rlpEncodeProof(proof.storageProof[0].proof);<br/>const valueStorageProof = rlpEncodeProof(proof.storageProof[1].proof);</code></p><p>and submit it to the contract:</p><p><code>//state root of mainnet block #13572667<br/>const blockStateRoot =<br/>  &quot;0xa710dad6c716e0b762a671865cbe0d286f158198580f4ac97c4ace95ea85ba1b&quot;;<br/>const baycAddress = &quot;0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d&quot;;<br/><br/>async function main() {<br/>  const Verifier = await ethers.getContractFactory(&quot;ProofVerifier&quot;);<br/>  // 0x52E357F616a13089435bE73E20CFfB788Eb4C928 on Görli:<br/>  const verifier = Verifier.attach(process.env.CONTRACT_VERIFIER);<br/><br/>  //&quot;account&quot; is the bored apes contract<br/>  const accountResult = await verifier.extractAccountFromProof(<br/>    baycAddress,<br/>    blockStateRoot,<br/>    rlpAccountProof<br/>  );<br/>  const indexResult = await verifier.extractSlotValueFromProof(<br/>    ethers.utils.keccak256(indexSlot),<br/>    accountResult.storageRoot,<br/>    rlpIndexProof<br/>  );<br/>  const valueResult = await verifier.extractSlotValueFromProof(<br/>    ethers.utils.keccak256(valueSlot),<br/>    accountResult.storageRoot,<br/>    rlpValueProof<br/>  );<br/><br/>  console.log(<br/>    accountResult,<br/>    indexResult.value.toHexString(),<br/>    valueResult.value.toHexString()<br/>  );<br/>}[<br/>  exists: true,<br/>  nonce: BigNumber { value: &quot;1&quot; },<br/>  balance: BigNumber { value: &quot;0&quot; },<br/>  storageRoot: &#x27;0x3f99b7df7989c11417c18b517c333ec74104e23ae76a50d578292ba3d466d77d&#x27;,<br/>  codeHash: &#x27;0x0ba5e25e74d81bab327110c8d8b44320f50ad5c3e91a546a5c5a9b605cf653b3&#x27;<br/>]<br/>0x0258<br/>0x0394451c1238cec1e825229e692aa9e428c107d8 // &lt;- Jimmy Fallon, again.</code></p><p>Creating <a target="_blank" href="https://eips.ethereum.org/EIPS/eip-1186">EIP-1186</a> compatible historical cryptographic proofs as demonstrated is a rather demanding task. It requires provers to traverse their archive nodes&#x27; LevelDBs, requiring up to 16 disk operations per account and storage slot. However, since state proofs like Jimmy Fallon&#x27;s Bored Ape ownership at block height 13572667 are deterministic and valid forever, one could presciently collect all of the hashes along the nodes from root of the state tree down to specific nodes and index them. Chain indexers or RPC relayers like Metamask could use those hashes to execute proofs, thus minimizing trust in the service itself: each reply would be provable by the client.</p><p>The Laconic Network greatly simplifies the process of generating proofs for blockchain data, saving time for developers, and avoiding the extensive recursive querying of full-node databases that would otherwise be required.</p></div></div></div></div></div></section><section class="section_share"><div class="padding-global"><div class="container-medium"><div class="share_component"><p class="share_header">Share This Article</p><div class="share_button-container"><div class="w-embed"><a class="share_button" target="_blank" href="https://twitter.com/intent/tweet?url=https://www.laconic.com/blog/what-is-a-proof">
<svg class="share_button-icon" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7.55016 21.3548c9.05434 0 14.00814-7.4471 14.00814-13.9033 0-.20936-.0047-.42337-.0141-.63273.9637-.69168 1.7953-1.54843 2.4558-2.52999-.8975.39631-1.8504.65515-2.8261.76765 1.0274-.61122 1.7966-1.57142 2.1652-2.7026-.9665.56851-2.0235.96954-3.1257 1.18591-.7426-.78315-1.7244-1.30169-2.7937-1.47544-1.0693-.17376-2.1665.00695-3.122.51417-.9554.50722-1.7159 1.31271-2.1639 2.29194-.4479.97922-.5584 2.07764-.3143 3.12543-1.95701-.09747-3.87156-.60206-5.61952-1.48104-1.74795-.87898-3.29029-2.11274-4.52701-3.62129-.62857 1.07562-.820913 2.34843-.53794 3.55975C1.418 7.66457 2.15506 8.7235 3.19641 9.41483c-.78178-.02463-1.54643-.23354-2.230785-.60947v.06048c-.0007 1.12879.392475 2.22296 1.112685 3.09656.72021.8736 1.72301 1.4727 2.83794 1.6955-.72419.1966-1.48427.2253-2.22141.0837.31461.9708.92673 1.8198 1.75093 2.4287.8242.6088 1.81935.9471 2.84657.9676-1.74392 1.3596-3.89817 2.0971-6.11578 2.0936C.783287 19.2309.390399 19.2069 0 19.1598c2.25286 1.4345 4.87353 2.1964 7.55016 2.195Z" fill="url(#:r2c:)"></path><defs><linearGradient id=":r2c:" x1="12" y1="2" x2="12" y2="21.3548" gradientUnits="userSpaceOnUse"><stop stop-color="var(--theme--color-white)"></stop><stop offset="1" stop-color="var(--theme--color-white)"></stop></linearGradient></defs></svg>
</a></div><div class="w-embed"><a class="share_button" target="_blank" href="https://reddit.com/submit?url=https://www.laconic.com/what-is-a-proof">
<svg class="share_button-icon" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 12c0 6.6274-5.3726 12-12 12-6.62742 0-12-5.3726-12-12C0 5.37258 5.37258 0 12 0c6.6274 0 12 5.37258 12 12Zm-5.7544-1.7544C19.214 10.2456 20 11.0316 20 12c0 .7158-.4351 1.3333-1.0105 1.614.0281.1684.0421.3369.0421.5193 0 2.6947-3.1298 4.8702-7.0035 4.8702-3.87371 0-7.00353-2.1755-7.00353-4.8702 0-.1824.01403-.3649.0421-.5333-.61754-.2807-1.03859-.8842-1.03859-1.6 0-.9684.78596-1.7544 1.75438-1.7544.46316 0 .89825.1965 1.20702.4912 1.20702-.88419 2.87719-1.43156 4.74382-1.4877l.8843-4.18246c.028-.08421.0701-.15438.1403-.19649.0702-.0421.1544-.05614.2386-.0421l2.9053.61754c.1965-.42105.6175-.70175 1.1087-.70175.6878 0 1.2492.5614 1.2492 1.24912s-.5614 1.24912-1.2492 1.24912c-.6736 0-1.221-.53333-1.2491-1.19298l-2.5965-.54737-.8 3.74737c1.8246.07018 3.4807.63158 4.6737 1.4877.3088-.3088.7298-.4912 1.207-.4912ZM9.24913 12c-.68772 0-1.24912.5614-1.24912 1.2491 0 .6877.5614 1.2491 1.24912 1.2491s1.24917-.5614 1.24917-1.2491c0-.6877-.56145-1.2491-1.24917-1.2491Zm2.76487 5.4596c.4772 0 2.1053-.0561 2.9614-.9123.1264-.1263.1264-.3228.0281-.4631-.1263-.1263-.3368-.1263-.4631 0-.5474.5333-1.6843.7298-2.5123.7298-.8281 0-1.979-.1965-2.5123-.7298-.12632-.1263-.33685-.1263-.46316 0-.12632.1263-.12632.3368 0 .4631.8421.8422 2.48416.9123 2.96136.9123Zm1.4878-4.2105c0 .6877.5614 1.2491 1.2491 1.2491.6877 0 1.2491-.5614 1.2491-1.2491C16 12.5614 15.4386 12 14.7509 12c-.6877 0-1.2491.5614-1.2491 1.2491Z" fill="url(#:r2d:)"></path><defs><linearGradient id=":r2d:" x1="12" y1="0" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="var(--theme--color-white)"></stop><stop offset="1" stop-color="var(--theme--color-white)"></stop></linearGradient></defs></svg>
</a></div><div class="w-embed"><a class="share_button" target="_blank" href="https://discord.com/invite/ukhbBemyxY">
<svg class="share_button-icon" viewBox="0 0 33 26" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M27.936 2.155A26.571 26.571 0 0 0 21.219.002a.1.1 0 0 0-.108.053c-.29.533-.611 1.229-.837 1.775a24.314 24.314 0 0 0-7.544 0 18.232 18.232 0 0 0-.85-1.775.105.105 0 0 0-.107-.053 26.497 26.497 0 0 0-6.717 2.153.097.097 0 0 0-.044.04C.733 8.8-.438 15.245.136 21.61c.003.03.02.06.043.08 2.823 2.142 5.557 3.443 8.24 4.305a.105.105 0 0 0 .116-.039c.635-.896 1.2-1.84 1.686-2.834a.11.11 0 0 0-.057-.15 17.773 17.773 0 0 1-2.574-1.269.111.111 0 0 1-.01-.181c.172-.134.345-.274.51-.414a.1.1 0 0 1 .107-.015c5.4 2.549 11.248 2.549 16.585 0a.099.099 0 0 1 .108.013c.165.141.338.282.512.416a.111.111 0 0 1-.01.181c-.821.497-1.676.916-2.575 1.267a.11.11 0 0 0-.055.152 22.854 22.854 0 0 0 1.684 2.833.103.103 0 0 0 .116.04c2.696-.862 5.43-2.163 8.253-4.305a.11.11 0 0 0 .043-.079c.688-7.358-1.153-13.75-4.88-19.415a.085.085 0 0 0-.042-.04Zm-16.909 15.58c-1.625 0-2.965-1.543-2.965-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.991 1.556 2.965 3.438 0 1.895-1.314 3.438-2.966 3.438Zm10.966 0c-1.626 0-2.966-1.543-2.966-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.992 1.556 2.966 3.438 0 1.895-1.301 3.438-2.966 3.438Z" fill="var(--theme--color-white)"></path></svg>
</a></div><div class="w-embed"><a class="share_button" target="_blank" href="https://t.me/share/url?url=https://www.laconic.com/blog/what-is-a-proof">
<svg class="share_button-icon" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M24 12c0 6.6274-5.3726 12-12 12-6.62742 0-12-5.3726-12-12C0 5.37258 5.37258 0 12 0c6.6274 0 12 5.37258 12 12ZM12.43 8.85893c-1.1672.48547-3.49986 1.49027-6.99811 3.01437-.56806.2259-.86563.4469-.89272.663-.04578.3652.41154.509 1.0343.7048.08471.0267.17248.0543.26247.0835.6127.1992 1.43689.4322 1.86535.4414.38865.0084.82244-.1518 1.30135-.4807 3.26856-2.2063 4.95576-3.32149 5.06166-3.34553.0747-.01696.1783-.03829.2485.02408.0701.06235.0632.18045.0558.21215-.0453.1931-1.8405 1.8621-2.7695 2.7258-.2896.2692-.495.4602-.537.5038-.0941.0977-.19.1902-.2821.279-.5692.5487-.99609.9602.0236 1.6322.49.3229.8822.5899 1.2733.8563.4273.291.8534.5812 1.4047.9426.1405.092.2746.1877.4053.2808.4972.3545.9438.6729 1.4957.6221.3206-.0295.6519-.331.8201-1.2302.3975-2.1253 1.1789-6.7299 1.3595-8.62743.0158-.16624-.0041-.379-.02-.4724-.016-.09339-.0494-.22646-.1708-.32497-.1438-.11666-.3658-.14126-.465-.13952-.4514.00795-1.1438.24874-4.4764 1.63485Z" fill="url(#:r2e:)" fill-rule="evenodd"></path><defs><linearGradient id=":r2e:" x1="12" y1="0" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="var(--theme--color-white)"></stop><stop offset="1" stop-color="var(--theme--color-white)"></stop></linearGradient></defs></svg>
</a></div><div class="w-embed"><a class="share_button" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://www.laconic.com/blog/what-is-a-proof">
<svg class="share_button-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24 12c0-6.62742-5.3726-12-12-12C5.37258 0 0 5.37258 0 12c0 5.9895 4.3882 10.954 10.125 11.8542v-8.3855H7.07812V12H10.125V9.35625c0-3.0075 1.7916-4.66875 4.5326-4.66875 1.3125 0 2.6862.23437 2.6862.23437V7.875h-1.5132c-1.4906 0-1.9556.92508-1.9556 1.875V12h3.3281l-.532 3.4687H13.875v8.3855C19.6118 22.954 24 17.9895 24 12Z" fill="url(#:r2f:)"></path><defs><linearGradient id=":r2f:" x1="12" y1="0" x2="12" y2="23.8542" gradientUnits="userSpaceOnUse"><stop stop-color="var(--theme--color-white)"></stop><stop offset="1" stop-color="var(--theme--color-white)"></stop></linearGradient></defs></svg>
</a></div></div><div class="share_button-icon"></div></div></div></div></section><section class="section_related-posts"><div class="padding-global"><div class="container-large"><div class="related-posts_component"><h2 class="hazy">Recent Articles</h2><div class="blog_collection-list-wrapper w-dyn-list"><div role="list" class="blog_grid w-dyn-items"><div role="listitem" class="blog_card w-dyn-item"><div class="blog_card-container"><div class="blog_card-header"><div class="blog_categories"><div class="blog_category-chip"><div>Developers</div></div><div class="blog_category-chip w-condition-invisible"><div>Insights</div></div><div class="blog_category-chip w-condition-invisible"><div>Product</div></div><div class="blog_category-chip w-condition-invisible"><div>News</div></div><div class="blog_category-chip w-condition-invisible"><div>Partners</div></div></div><div class="blog_publish-date">8.20.2024</div></div><div class="blog_card-image-container"><img src="../images/og.webp" loading="lazy" alt="" sizes="(max-width: 479px) 100vw, (max-width: 991px) 94vw, 67vw" srcset="../images/og-p-500.webp 500w, ../images/og-p-800.webp 800w, ../images/og-p-1080.webp 1080w, ../images/og.webp 1200w" class="blog_card-image"/></div><div class="blog_card-content"><h2 class="blog_card-title">LORO Testnet Stage 1 is Live</h2><a href="/blog/stage1-live" class="blog_link w-inline-block"><div class="blog_link-text">Read Article</div><svg fill="none" viewBox="0 0 11 11" xmlns="http://www.w3.org/2000/svg" class="blog_link-icon"><path d="M1.455 10.557.427 9.53l7.648-7.662H2.167L2.181.443h8.347v8.36H9.091l.013-5.907-7.649 7.661Z" fill="var(--theme--color-white)"></path></svg></a></div></div></div><div role="listitem" class="blog_card w-dyn-item"><div class="blog_card-container"><div class="blog_card-header"><div class="blog_categories"><div class="blog_category-chip"><div>Developers</div></div><div class="blog_category-chip w-condition-invisible"><div>Insights</div></div><div class="blog_category-chip w-condition-invisible"><div>Product</div></div><div class="blog_category-chip w-condition-invisible"><div>News</div></div><div class="blog_category-chip w-condition-invisible"><div>Partners</div></div></div><div class="blog_publish-date">8.12.2024</div></div><div class="blog_card-image-container"><img src="../images/deep-dive-testnet.webp" loading="lazy" alt="" sizes="(max-width: 479px) 100vw, (max-width: 991px) 94vw, 67vw" srcset="../images/deep-dive-testnet-p-500.webp 500w, ../images/deep-dive-testnet-p-800.webp 800w, ../images/deep-dive-testnet-p-1080.webp 1080w, ../images/deep-dive-testnet.webp 1440w" class="blog_card-image"/></div><div class="blog_card-content"><h2 class="blog_card-title">How to Register for the Laconic Incentivized Testnet</h2><a href="/blog/testnet-update" class="blog_link w-inline-block"><div class="blog_link-text">Read Article</div><svg fill="none" viewBox="0 0 11 11" xmlns="http://www.w3.org/2000/svg" class="blog_link-icon"><path d="M1.455 10.557.427 9.53l7.648-7.662H2.167L2.181.443h8.347v8.36H9.091l.013-5.907-7.649 7.661Z" fill="var(--theme--color-white)"></path></svg></a></div></div></div><div role="listitem" class="blog_card w-dyn-item"><div class="blog_card-container"><div class="blog_card-header"><div class="blog_categories"><div class="blog_category-chip"><div>Developers</div></div><div class="blog_category-chip w-condition-invisible"><div>Insights</div></div><div class="blog_category-chip w-condition-invisible"><div>Product</div></div><div class="blog_category-chip w-condition-invisible"><div>News</div></div><div class="blog_category-chip w-condition-invisible"><div>Partners</div></div></div><div class="blog_publish-date">7.24.2024</div></div><div class="blog_card-image-container"><img src="../images/chain-minimalism.webp" loading="lazy" alt="" sizes="(max-width: 479px) 100vw, (max-width: 991px) 94vw, 67vw" srcset="../images/chain-minimalism-p-500.webp 500w, ../images/chain-minimalism-p-800.webp 800w, ../images/chain-minimalism.webp 966w" class="blog_card-image"/></div><div class="blog_card-content"><h2 class="blog_card-title">A Return to Chain Minimalism</h2><a href="/blog/chain-minimalism" class="blog_link w-inline-block"><div class="blog_link-text">Read Article</div><svg fill="none" viewBox="0 0 11 11" xmlns="http://www.w3.org/2000/svg" class="blog_link-icon"><path d="M1.455 10.557.427 9.53l7.648-7.662H2.167L2.181.443h8.347v8.36H9.091l.013-5.907-7.649 7.661Z" fill="var(--theme--color-white)"></path></svg></a></div></div></div></div></div></div></div></div></section></main><footer class="footer"><div class="padding-global"><div class="container-large"><div class="footer_container"><a aria-label="Go to Homepage" href="/" class="w-inline-block"><svg fill="none" viewBox="0 0 305 70" xmlns="http://www.w3.org/2000/svg" class="footer_logo"><path d="M0 68.656h29.794v-8.834H9.96V1.35H0v67.306ZM69.388 1.35H52.873L35.61 68.656H45.9l4.316-16.826h21.33l4.315 16.826H86.65L69.388 1.35ZM52.292 43.416l8.631-34.83h.332l8.3 34.83H52.291ZM118.076 27.427h11.619C129.695 8.245 123.636 0 109.528 0 94.672 0 88.282 10.432 88.282 34.915c0 24.567 6.39 35.084 21.246 35.084 14.108 0 20.167-7.993 20.25-26.586h-11.619c-.083 14.555-1.826 18.173-8.631 18.173-7.802 0-9.71-5.3-9.627-26.67 0-21.286 1.908-26.587 9.627-26.503 6.805 0 8.548 3.786 8.548 19.014ZM158.069 0c15.105.085 21.578 10.601 21.578 35s-6.473 34.915-21.578 35c-15.188.084-21.661-10.433-21.661-35s6.473-35.084 21.661-35Zm-10.042 35c0 21.286 1.992 26.586 10.042 26.586 7.967 0 9.959-5.3 9.959-26.586 0-21.37-1.992-26.67-9.959-26.586-8.05.084-10.042 5.384-10.042 26.586ZM198.74 68.572l-9.959.084V1.35h17.511l16.35 54.855h.166V1.35h9.959v67.306h-16.432L198.906 9.595h-.166v58.977ZM254.391 1.35h-9.959v67.306h9.959V1.35ZM293.298 27.427h11.619C304.917 8.245 298.859 0 284.75 0c-14.856 0-21.246 10.432-21.246 34.915 0 24.567 6.39 35.084 21.246 35.084 14.109 0 20.167-7.993 20.25-26.586h-11.619c-.083 14.555-1.826 18.173-8.631 18.173-7.801 0-9.71-5.3-9.627-26.67 0-21.286 1.909-26.587 9.627-26.503 6.805 0 8.548 3.786 8.548 19.014Z" fill="var(--theme--color-white)"></path></svg></a><nav class="footer_menu"><a href="/products" class="footer_link primary">Products</a><a href="/partners" class="footer_link primary">Partners</a><a href="/community" class="footer_link primary">Community</a><div class="footer_social-container"><div class="footer_header">Connect</div><div class="footer_social-links tablet"><a aria-label="Visit our Twitter" href="https://twitter.com/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M7.55016 21.3548c9.05434 0 14.00814-7.4471 14.00814-13.9033 0-.20936-.0047-.42337-.0141-.63273.9637-.69168 1.7953-1.54843 2.4558-2.52999-.8975.39631-1.8504.65515-2.8261.76765 1.0274-.61122 1.7966-1.57142 2.1652-2.7026-.9665.56851-2.0235.96954-3.1257 1.18591-.7426-.78315-1.7244-1.30169-2.7937-1.47544-1.0693-.17376-2.1665.00695-3.122.51417-.9554.50722-1.7159 1.31271-2.1639 2.29194-.4479.97922-.5584 2.07764-.3143 3.12543-1.95701-.09747-3.87156-.60206-5.61952-1.48104-1.74795-.87898-3.29029-2.11274-4.52701-3.62129-.62857 1.07562-.820913 2.34843-.53794 3.55975C1.418 7.66457 2.15506 8.7235 3.19641 9.41483c-.78178-.02463-1.54643-.23354-2.230785-.60947v.06048c-.0007 1.12879.392475 2.22296 1.112685 3.09656.72021.8736 1.72301 1.4727 2.83794 1.6955-.72419.1966-1.48427.2253-2.22141.0837.31461.9708.92673 1.8198 1.75093 2.4287.8242.6088 1.81935.9471 2.84657.9676-1.74392 1.3596-3.89817 2.0971-6.11578 2.0936C.783287 19.2309.390399 19.2069 0 19.1598c2.25286 1.4345 4.87353 2.1964 7.55016 2.195Z" fill="url(#:r12:)"></path><defs><linearGradient id=":r12:" x1="12" y1="2" x2="12" y2="21.3548" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a><a aria-label="Join our Discord" href="https://discord.com/invite/ukhbBemyxY" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33 26" class="footer_social-icon"><path d="M27.936 2.155A26.571 26.571 0 0 0 21.219.002a.1.1 0 0 0-.108.053c-.29.533-.611 1.229-.837 1.775a24.314 24.314 0 0 0-7.544 0 18.232 18.232 0 0 0-.85-1.775.105.105 0 0 0-.107-.053 26.497 26.497 0 0 0-6.717 2.153.097.097 0 0 0-.044.04C.733 8.8-.438 15.245.136 21.61c.003.03.02.06.043.08 2.823 2.142 5.557 3.443 8.24 4.305a.105.105 0 0 0 .116-.039c.635-.896 1.2-1.84 1.686-2.834a.11.11 0 0 0-.057-.15 17.773 17.773 0 0 1-2.574-1.269.111.111 0 0 1-.01-.181c.172-.134.345-.274.51-.414a.1.1 0 0 1 .107-.015c5.4 2.549 11.248 2.549 16.585 0a.099.099 0 0 1 .108.013c.165.141.338.282.512.416a.111.111 0 0 1-.01.181c-.821.497-1.676.916-2.575 1.267a.11.11 0 0 0-.055.152 22.854 22.854 0 0 0 1.684 2.833.103.103 0 0 0 .116.04c2.696-.862 5.43-2.163 8.253-4.305a.11.11 0 0 0 .043-.079c.688-7.358-1.153-13.75-4.88-19.415a.085.085 0 0 0-.042-.04Zm-16.909 15.58c-1.625 0-2.965-1.543-2.965-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.991 1.556 2.965 3.438 0 1.895-1.314 3.438-2.966 3.438Zm10.966 0c-1.626 0-2.966-1.543-2.966-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.992 1.556 2.966 3.438 0 1.895-1.301 3.438-2.966 3.438Z" fill="currentColor"></path></svg></a><a aria-label="Visit our Youtube Channel" href="https://www.youtube.com/@Laconic-Network" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" class="footer_social-icon"><path d="M 15 4 C 10.814 4 5.3808594 5.0488281 5.3808594 5.0488281 L 5.3671875 5.0644531 C 3.4606632 5.3693645 2 7.0076245 2 9 L 2 15 L 2 15.001953 L 2 21 L 2 21.001953 A 4 4 0 0 0 5.3769531 24.945312 L 5.3808594 24.951172 C 5.3808594 24.951172 10.814 26.001953 15 26.001953 C 19.186 26.001953 24.619141 24.951172 24.619141 24.951172 L 24.621094 24.949219 A 4 4 0 0 0 28 21.001953 L 28 21 L 28 15.001953 L 28 15 L 28 9 A 4 4 0 0 0 24.623047 5.0546875 L 24.619141 5.0488281 C 24.619141 5.0488281 19.186 4 15 4 z M 12 10.398438 L 20 15 L 12 19.601562 L 12 10.398438 z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></a><a aria-label="Chat with us on Telegram" href="https://t.me/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M24 12c0 6.6274-5.3726 12-12 12-6.62742 0-12-5.3726-12-12C0 5.37258 5.37258 0 12 0c6.6274 0 12 5.37258 12 12ZM12.43 8.85893c-1.1672.48547-3.49986 1.49027-6.99811 3.01437-.56806.2259-.86563.4469-.89272.663-.04578.3652.41154.509 1.0343.7048.08471.0267.17248.0543.26247.0835.6127.1992 1.43689.4322 1.86535.4414.38865.0084.82244-.1518 1.30135-.4807 3.26856-2.2063 4.95576-3.32149 5.06166-3.34553.0747-.01696.1783-.03829.2485.02408.0701.06235.0632.18045.0558.21215-.0453.1931-1.8405 1.8621-2.7695 2.7258-.2896.2692-.495.4602-.537.5038-.0941.0977-.19.1902-.2821.279-.5692.5487-.99609.9602.0236 1.6322.49.3229.8822.5899 1.2733.8563.4273.291.8534.5812 1.4047.9426.1405.092.2746.1877.4053.2808.4972.3545.9438.6729 1.4957.6221.3206-.0295.6519-.331.8201-1.2302.3975-2.1253 1.1789-6.7299 1.3595-8.62743.0158-.16624-.0041-.379-.02-.4724-.016-.09339-.0494-.22646-.1708-.32497-.1438-.11666-.3658-.14126-.465-.13952-.4514.00795-1.1438.24874-4.4764 1.63485Z" fill="url(#:r13:)" clip-rule="evenodd" fill-rule="evenodd"></path><defs><linearGradient id=":r13:" x1="12" y1="2" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a></div></div></nav></div><nav class="footer_subfooter"><p class="legal">Laconic: Offshore Hosting Made Easy</p><div class="footer_subfooter-links"><a href="/privacy-policy" class="footer_link">Privacy Policy</a><div class="theme-toggle_wrapper"><div id="toggle-label" class="footer_toggle-label">Dark Mode</div><a id="theme-toggle" aria-label="Toggle dark and light theme" href="#" class="footer_toggle w-inline-block"><div class="footer_toggle-circle"></div></a></div></div><div class="footer_social-links phone"><a aria-label="Follow us on Twitter" href="https://twitter.com/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M7.55016 21.3548c9.05434 0 14.00814-7.4471 14.00814-13.9033 0-.20936-.0047-.42337-.0141-.63273.9637-.69168 1.7953-1.54843 2.4558-2.52999-.8975.39631-1.8504.65515-2.8261.76765 1.0274-.61122 1.7966-1.57142 2.1652-2.7026-.9665.56851-2.0235.96954-3.1257 1.18591-.7426-.78315-1.7244-1.30169-2.7937-1.47544-1.0693-.17376-2.1665.00695-3.122.51417-.9554.50722-1.7159 1.31271-2.1639 2.29194-.4479.97922-.5584 2.07764-.3143 3.12543-1.95701-.09747-3.87156-.60206-5.61952-1.48104-1.74795-.87898-3.29029-2.11274-4.52701-3.62129-.62857 1.07562-.820913 2.34843-.53794 3.55975C1.418 7.66457 2.15506 8.7235 3.19641 9.41483c-.78178-.02463-1.54643-.23354-2.230785-.60947v.06048c-.0007 1.12879.392475 2.22296 1.112685 3.09656.72021.8736 1.72301 1.4727 2.83794 1.6955-.72419.1966-1.48427.2253-2.22141.0837.31461.9708.92673 1.8198 1.75093 2.4287.8242.6088 1.81935.9471 2.84657.9676-1.74392 1.3596-3.89817 2.0971-6.11578 2.0936C.783287 19.2309.390399 19.2069 0 19.1598c2.25286 1.4345 4.87353 2.1964 7.55016 2.195Z" fill="url(#:r24:)"></path><defs><linearGradient id=":r24:" x1="12" y1="2" x2="12" y2="21.3548" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a><a aria-label="Join us on Discord" href="https://discord.com/invite/ukhbBemyxY" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33 26" class="footer_social-icon"><path d="M27.936 2.155A26.571 26.571 0 0 0 21.219.002a.1.1 0 0 0-.108.053c-.29.533-.611 1.229-.837 1.775a24.314 24.314 0 0 0-7.544 0 18.232 18.232 0 0 0-.85-1.775.105.105 0 0 0-.107-.053 26.497 26.497 0 0 0-6.717 2.153.097.097 0 0 0-.044.04C.733 8.8-.438 15.245.136 21.61c.003.03.02.06.043.08 2.823 2.142 5.557 3.443 8.24 4.305a.105.105 0 0 0 .116-.039c.635-.896 1.2-1.84 1.686-2.834a.11.11 0 0 0-.057-.15 17.773 17.773 0 0 1-2.574-1.269.111.111 0 0 1-.01-.181c.172-.134.345-.274.51-.414a.1.1 0 0 1 .107-.015c5.4 2.549 11.248 2.549 16.585 0a.099.099 0 0 1 .108.013c.165.141.338.282.512.416a.111.111 0 0 1-.01.181c-.821.497-1.676.916-2.575 1.267a.11.11 0 0 0-.055.152 22.854 22.854 0 0 0 1.684 2.833.103.103 0 0 0 .116.04c2.696-.862 5.43-2.163 8.253-4.305a.11.11 0 0 0 .043-.079c.688-7.358-1.153-13.75-4.88-19.415a.085.085 0 0 0-.042-.04Zm-16.909 15.58c-1.625 0-2.965-1.543-2.965-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.991 1.556 2.965 3.438 0 1.895-1.314 3.438-2.966 3.438Zm10.966 0c-1.626 0-2.966-1.543-2.966-3.438 0-1.895 1.314-3.438 2.966-3.438 1.665 0 2.992 1.556 2.966 3.438 0 1.895-1.301 3.438-2.966 3.438Z" fill="currentColor"></path></svg></a><a aria-label="Check out our Youtube Channel" href="https://www.youtube.com/@Laconic-Network" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" class="footer_social-icon"><path d="M 15 4 C 10.814 4 5.3808594 5.0488281 5.3808594 5.0488281 L 5.3671875 5.0644531 C 3.4606632 5.3693645 2 7.0076245 2 9 L 2 15 L 2 15.001953 L 2 21 L 2 21.001953 A 4 4 0 0 0 5.3769531 24.945312 L 5.3808594 24.951172 C 5.3808594 24.951172 10.814 26.001953 15 26.001953 C 19.186 26.001953 24.619141 24.951172 24.619141 24.951172 L 24.621094 24.949219 A 4 4 0 0 0 28 21.001953 L 28 21 L 28 15.001953 L 28 15 L 28 9 A 4 4 0 0 0 24.623047 5.0546875 L 24.619141 5.0488281 C 24.619141 5.0488281 19.186 4 15 4 z M 12 10.398438 L 20 15 L 12 19.601562 L 12 10.398438 z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></a><a aria-label="Chat with us on Telegram" href="https://t.me/laconicnetwork" target="_blank" class="social-link w-inline-block"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="footer_social-icon"><path d="M24 12c0 6.6274-5.3726 12-12 12-6.62742 0-12-5.3726-12-12C0 5.37258 5.37258 0 12 0c6.6274 0 12 5.37258 12 12ZM12.43 8.85893c-1.1672.48547-3.49986 1.49027-6.99811 3.01437-.56806.2259-.86563.4469-.89272.663-.04578.3652.41154.509 1.0343.7048.08471.0267.17248.0543.26247.0835.6127.1992 1.43689.4322 1.86535.4414.38865.0084.82244-.1518 1.30135-.4807 3.26856-2.2063 4.95576-3.32149 5.06166-3.34553.0747-.01696.1783-.03829.2485.02408.0701.06235.0632.18045.0558.21215-.0453.1931-1.8405 1.8621-2.7695 2.7258-.2896.2692-.495.4602-.537.5038-.0941.0977-.19.1902-.2821.279-.5692.5487-.99609.9602.0236 1.6322.49.3229.8822.5899 1.2733.8563.4273.291.8534.5812 1.4047.9426.1405.092.2746.1877.4053.2808.4972.3545.9438.6729 1.4957.6221.3206-.0295.6519-.331.8201-1.2302.3975-2.1253 1.1789-6.7299 1.3595-8.62743.0158-.16624-.0041-.379-.02-.4724-.016-.09339-.0494-.22646-.1708-.32497-.1438-.11666-.3658-.14126-.465-.13952-.4514.00795-1.1438.24874-4.4764 1.63485Z" fill="url(#:r25:)" clip-rule="evenodd" fill-rule="evenodd"></path><defs><linearGradient id=":r25:" x1="12" y1="2" x2="12" y2="24" gradientUnits="userSpaceOnUse"><stop stop-color="currentColor"></stop><stop stop-color="currentColor" stop-offset="1"></stop></linearGradient></defs></svg></a></div></nav></div></div></footer></div><script src="../js/jquery.js" type="text/javascript" ></script><script src="../js/webflow-script.js" type="text/javascript"></script><script>
const root = document.documentElement;
// Setup object to store all class and ID selectors
const setup = {
themeToggleButtons: document.querySelectorAll('#theme-toggle'),
lottiePaths: () => document.querySelectorAll('#nav-button svg path'),
toggleLabels: document.querySelectorAll('#toggle-label'),
themeColorVariable: '--theme--color-white'
};
// Update theme-dependant images
function updateImageSources() {
const images = document.querySelectorAll('img[data-src-dark]');
images.forEach(img => {
const currentTheme = root.getAttribute('data-theme');
const newSrc = currentTheme === 'dark' ? img.getAttribute('data-src-dark') : img.getAttribute('data-src-light');
img.setAttribute('src', newSrc);
});
}
// update theme dependant background images
function updateBackgroundImages() {
const elements = document.querySelectorAll('[data-bg-dark]');
elements.forEach(element => {
const currentTheme = root.getAttribute('data-theme');
const newBg = currentTheme === 'dark' ? element.getAttribute('data-bg-dark') : element.getAttribute('data-bg-light');
element.style.backgroundImage = `url(${newBg})`;
});
}
// Update lottie assets to match theme
function updateLottiePathColors() {
const paths = setup.lottiePaths();
if (paths.length > 0) {
paths.forEach(path => {
path.style.fill = `var(${setup.themeColorVariable})`;
});
}
}
function updateVideoVisibility() {
const darkVideo = document.querySelector('#background-video-dark');
const lightVideo = document.querySelector('#background-video-light');
if (darkVideo && lightVideo) {
const currentTheme = root.getAttribute('data-theme');
if (currentTheme === 'dark') {
darkVideo.style.display = 'block';
lightVideo.style.display = 'none';
} else {
darkVideo.style.display = 'none';
lightVideo.style.display = 'block';
}
} else {
console.log('No background video elements found on this page.');
}
}
// Theme toggle
function toggleTheme() {
const currentTheme = root.getAttribute('data-theme');
if (currentTheme === 'dark') {
root.setAttribute('data-theme', 'light');
localStorage.setItem('theme', 'light');
setup.toggleLabels.forEach(label => label.textContent = 'Light Mode');
} else {
root.setAttribute('data-theme', 'dark');
localStorage.setItem('theme', 'dark');
setup.toggleLabels.forEach(label => label.textContent = 'Dark Mode');
}
updateImageSources(); // Update images when the theme is toggled
updateLottiePathColors(); // Update Lottie colors when the theme is toggled
updateVideoVisibility() // Update background videos when theme is toggled
updateBackgroundImages(); // For background image swap
}
// Initialize the theme
function initializeTheme() {
const storedTheme = localStorage.getItem('theme');
// Set the initial theme
if (storedTheme) {
root.setAttribute('data-theme', storedTheme);
setup.toggleLabels.forEach(label => {
label.textContent = storedTheme === 'dark' ? 'Dark Mode' : 'Light Mode';
});
console.log(`Theme set to: ${storedTheme}`);
} else {
root.setAttribute('data-theme', 'dark');
setup.toggleLabels.forEach(label => label.textContent = 'Dark Mode');
console.log('Theme set to: dark');
}
updateImageSources();
updateLottiePathColors();
updateVideoVisibility()
updateBackgroundImages(); // For background image swap
}
// When page content is loaded
document.addEventListener('DOMContentLoaded', () => {
// Initialize the theme
initializeTheme();
// Add event listener to all theme toggle buttons
setup.themeToggleButtons.forEach(button => {
button.addEventListener('click', toggleTheme);
});
// Ensure Lottie path colors and image sources are updated on page load
window.addEventListener('load', () => {
updateLottiePathColors();
updateImageSources();
updateVideoVisibility()
});
});
</script></body></html>