1<!DOCTYPE html><html><head><title>To DA capacity and beyond</title><meta name="image" content="/posts/to-da-capacity-and-beyond/preview.jpg"/><meta name="description" content="A draft design of a multi rollup system."/><meta charSet="utf-8"/><meta name="viewport" content="initial-scale=1.0, width=device-width"/><link rel="shortcut icon" href="/favicon.ico"/><meta property="og:title" content="To DA capacity and beyond"/><meta property="og:description" content="A draft design of a multi rollup system."/><meta property="og:image" content="/posts/to-da-capacity-and-beyond/preview.jpg"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="To DA capacity and beyond"/><meta name="twitter:description" content="A draft design of a multi rollup system."/><meta name="twitter:image" content="/posts/to-da-capacity-and-beyond/preview.jpg"/><meta name="next-head-count" content="13"/><link rel="preload" href="/_next/static/css/bfa2bfecf6f488b6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bfa2bfecf6f488b6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/218a4c01ff182862.css" as="style"/><link rel="stylesheet" href="/_next/static/css/218a4c01ff182862.css" data-n-p=""/><noscript data-n-css=""></noscript>
1<script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script>
1<script src="/_next/static/chunks/webpack-62c02dad1a6a4cb4.js" defer=""></script>
1<script src="/_next/static/chunks/framework-2c79e2a64abdb08b.js" defer=""></script>
1<script src="/_next/static/chunks/main-a0dca5a2ff5035f1.js" defer=""></script>
1<script src="/_next/static/chunks/pages/_app-5332de54648c5be5.js" defer=""></script>
1<script src="/_next/static/chunks/1bfc9850-b4d984e01731c818.js" defer=""></script>
1<script src="/_next/static/chunks/175675d1-c2f1f83d638b270d.js" defer=""></script>
1<script src="/_next/static/chunks/50-9adf3eb6711c73d2.js" defer=""></script>
1<script src="/_next/static/chunks/704-f981955d279e2fd0.js" defer=""></script>
1<script src="/_next/static/chunks/874-a9b124c0533c8b28.js" defer=""></script>
1<script src="/_next/static/chunks/pages/%5Bslug%5D-8642548b0da463d4.js" defer=""></script>
1<script src="/_next/static/lTTgvjFePycNwogzJDGnr/_buildManifest.js" defer=""></script>
1<script src="/_next/static/lTTgvjFePycNwogzJDGnr/_ssgManifest.js" defer=""></script>
1</head><body><div id="__next"><style data-emotion="css-global 1h2ejin">:host,:root,[data-theme]{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black:#000000;--chakra-colors-white:#FFFFFF;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-50:#F7FAFC;--chakra-colors-gray-100:#EDF2F7;--chakra-colors-gray-200:#E2E8F0;--chakra-colors-gray-300:#CBD5E0;--chakra-colors-gray-400:#A0AEC0;--chakra-colors-gray-500:#718096;--chakra-colors-gray-600:#4A5568;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#171923;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FED7D7;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#FC8181;--chakra-colors-red-400:#F56565;--chakra-colors-red-500:#E53E3E;--chakra-colors-red-600:#C53030;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FEEBC8;--chakra-colors-orange-200:#FBD38D;--chakra-colors-orange-300:#F6AD55;--chakra-colors-orange-400:#ED8936;--chakra-colors-orange-500:#DD6B20;--chakra-colors-orange-600:#C05621;--chakra-colors-orange-700:#9C4221;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FEFCBF;--chakra-colors-yellow-200:#FAF089;--chakra-colors-yellow-300:#F6E05E;--chakra-colors-yellow-400:#ECC94B;--chakra-colors-yellow-500:#D69E2E;--chakra-colors-yellow-600:#B7791F;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#C6F6D5;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#68D391;
1--chakra-colors-green-400:#48BB78;--chakra-colors-green-500:#38A169;--chakra-colors-green-600:#2F855A;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#bee3f8;--chakra-colors-blue-200:#90cdf4;--chakra-colors-blue-300:#63b3ed;--chakra-colors-blue-400:#4299e1;--chakra-colors-blue-500:#3182ce;--chakra-colors-blue-600:#2b6cb0;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-cyan-400:#0BC5EA;--chakra-colors-cyan-500:#00B5D8;--chakra-colors-cyan-600:#00A3C4;--chakra-colors-cyan-700:#0987A0;--chakra-colors-cyan-800:#086F83;--chakra-colors-cyan-900:#065666;--chakra-colors-purple-50:#FAF5FF;--chakra-colors-purple-100:#E9D8FD;--chakra-colors-purple-200:#D6BCFA;--chakra-colors-purple-300:#B794F4;--chakra-colors-purple-400:#9F7AEA;--chakra-colors-purple-500:#805AD5;--chakra-colors-purple-600:#6B46C1;--chakra-colors-purple-700:#553C9A;--chakra-colors-purple-800:#44337A;--chakra-colors-purple-900:#322659;--chakra-colors-pink-50:#FFF5F7;--chakra-colors-pink-100:#FED7E2;--chakra-colors-pink-200:#FBB6CE;--chakra-colors-pink-300:#F687B3;--chakra-colors-pink-400:#ED64A6;--chakra-colors-pink-500:#D53F8C;--chakra-colors-pink-600:#B83280;--chakra-colors-pink-700:#97266D;--chakra-colors-pink-800:#702459;--chakra-colors-pink-900:#521B41;--chakra-colors-linkedin-50:#E8F4F9;--chakra-colors-linkedin-100:#CFEDFB;--chakra-colors-linkedin-200:#9BDAF3;--chakra-colors-linkedin-300:#68C7EC;--chakra-colors-linkedin-400:#34B3E4;--chakra-colors-linkedin-500:#00A0DC;--chakra-colors-linkedin-600:#008CC9;--chakra-colors-linkedin-700:#0077B5;--chakra-colors-linkedin-800:#005E93;--chakra-colors-linkedin-900:#004471;--chakra-colors-facebook-50:#E8F4F9;--chakra-colors-facebook-100:#D9DEE9;--chakra-colors-facebook-200:#B7C2DA;--chakra-colors-facebook-300:#6482C0;--chakra-colors-facebook-400:#4267B2;--chakra-colors-facebook-500:#385898;--chakra-colors-facebook-600:#314E89;--chakra-colors-facebook-700:#29487D;--chakra-colors-facebook-800:#223B67;--chakra-colors-facebook-900:#1E355B;--chakra-colors-messenger-50:#D0E6FF;--chakra-colors-messenger-100:#B9DAFF;--chakra-colors-messenger-200:#A2CDFF;--chakra-colors-messenger-300:#7AB8FF;--chakra-colors-messenger-400:#2E90FF;--chakra-colors-messenger-500:#0078FF;--chakra-colors-messenger-600:#0063D1;--chakra-colors-messenger-700:#0052AC;--chakra-colors-messenger-800:#003C7E;--chakra-colors-messenger-900:#002C5C;--chakra-colors-whatsapp-50:#dffeec;--chakra-colors-whatsapp-100:#b9f5d0;--chakra-colors-whatsapp-200:#90edb3;--chakra-colors-whatsapp-300:#65e495;--chakra-colors-whatsapp-400:#3cdd78;--chakra-colors-whatsapp-500:#22c35e;--chakra-colors-whatsapp-600:#179848;--chakra-colors-whatsapp-700:#0c6c33;--chakra-colors-whatsapp-800:#01421c;--chakra-colors-whatsapp-900:#001803;--chakra-colors-twitter-50:#E5F4FD;--chakra-colors-twitter-100:#C8E9FB;--chakra-colors-twitter-200:#A8DCFA;--chakra-colors-twitter-300:#83CDF7;--chakra-colors-twitter-400:#57BBF5;--chakra-colors-twitter-500:#1DA1F2;--chakra-colors-twitter-600:#1A94DA;--chakra-colors-twitter-700:#1681BF;--chakra-colors-twitter-800:#136B9E;--chakra-colors-twitter-900:#0D4D71;--chakra-colors-telegram-50:#E3F2F9;--chakra-colors-telegram-100:#C5E4F3;--chakra-colors-telegram-200:#A2D4EC;--chakra-colors-telegram-300:#7AC1E4;--chakra-colors-telegram-400:#47A9DA;--chakra-colors-telegram-500:#0088CC;--chakra-colors-telegram-600:#007AB8;--chakra-colors-telegram-700:#006BA1;--chakra-colors-telegram-800:#005885;--chakra-colors-telegram-900:#003F5E;--chakra-borders-none:0;--chakra-borders-1px:1px solid;--chakra-borders-2px:2px solid;--chakra-borders-4px:4px solid;--chakra-borders-8px:8px solid;--chakra-fonts-heading:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-body:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--chakra-fontSizes-3xs:0.45rem;--chakra-fontSizes-2xs:0.625rem;--chakra-fontSizes-xs:0.75rem;--chakra-fontSizes-sm:0.875rem;--chakra-fontSizes-md:1rem;--chakra-fontSizes-lg:1.125rem;--chakra-fontSizes-xl:1.25rem;--chakra-fontSizes-2xl:1.5rem;--chakra-fontSizes-3xl:1.875rem;--chakra-fontSizes-4xl:2.25rem;--chakra-fontSizes-5xl:3rem;--chakra-fontSizes-6xl:3.75rem;--chakra-fontSizes-7xl:4.5rem;--chakra-fontSizes-8xl:6rem;--chakra-fontSizes-9xl:8rem;--chakra-fontWeights-hairline:100;--chakra-fontWeights-thin:200;--chakra-fontWeights-light:300;--chakra-fontWeights-normal:400;--chakra-fontWeights-medium:500;--chakra-fontWeights-semibold:600;--chakra-fontWeights-bold:700;--chakra-fontWeights-extrabold:800;--chakra-fontWeights-black:900;--chakra-letterSpacings-tighter:-0.05em;
1--chakra-letterSpacings-tight:-0.025em;--chakra-letterSpacings-normal:0;--chakra-letterSpacings-wide:0.025em;--chakra-letterSpacings-wider:0.05em;--chakra-letterSpacings-widest:0.1em;--chakra-lineHeights-3:.75rem;--chakra-lineHeights-4:1rem;--chakra-lineHeights-5:1.25rem;--chakra-lineHeights-6:1.5rem;--chakra-lineHeights-7:1.75rem;--chakra-lineHeights-8:2rem;--chakra-lineHeights-9:2.25rem;--chakra-lineHeights-10:2.5rem;--chakra-lineHeights-normal:normal;--chakra-lineHeights-none:1;--chakra-lineHeights-shorter:1.25;--chakra-lineHeights-short:1.375;--chakra-lineHeights-base:1.5;--chakra-lineHeights-tall:1.625;--chakra-lineHeights-taller:2;--chakra-radii-none:0;--chakra-radii-sm:0.125rem;--chakra-radii-base:0.25rem;--chakra-radii-md:0.375rem;--chakra-radii-lg:0.5rem;--chakra-radii-xl:0.75rem;--chakra-radii-2xl:1rem;--chakra-radii-3xl:1.5rem;--chakra-radii-full:9999px;--chakra-space-1:0.25rem;--chakra-space-2:0.5rem;--chakra-space-3:0.75rem;--chakra-space-4:1rem;--chakra-space-5:1.25rem;--chakra-space-6:1.5rem;--chakra-space-7:1.75rem;--chakra-space-8:2rem;--chakra-space-9:2.25rem;--chakra-space-10:2.5rem;--chakra-space-12:3rem;--chakra-space-14:3.5rem;--chakra-space-16:4rem;--chakra-space-20:5rem;--chakra-space-24:6rem;--chakra-space-28:7rem;--chakra-space-32:8rem;--chakra-space-36:9rem;--chakra-space-40:10rem;--chakra-space-44:11rem;--chakra-space-48:12rem;--chakra-space-52:13rem;--chakra-space-56:14rem;--chakra-space-60:15rem;--chakra-space-64:16rem;--chakra-space-72:18rem;--chakra-space-80:20rem;--chakra-space-96:24rem;--chakra-space-px:1px;--chakra-space-0-5:0.125rem;--chakra-space-1-5:0.375rem;--chakra-space-2-5:0.625rem;--chakra-space-3-5:0.875rem;--chakra-shadows-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--chakra-shadows-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--chakra-shadows-base:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--chakra-shadows-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--chakra-shadows-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--chakra-shadows-xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--chakra-shadows-2xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--chakra-shadows-outline:0 0 0 3px rgba(66, 153, 225, 0.6);--chakra-shadows-inner:inset 0 2px 4px 0 rgba(0,0,0,0.06);--chakra-shadows-none:none;--chakra-shadows-dark-lg:rgba(0, 0, 0, 0.1) 0px 0px 0px 1px,rgba(0, 0, 0, 0.2) 0px 5px 10px,rgba(0, 0, 0, 0.4) 0px 15px 40px;--chakra-sizes-1:0.25rem;--chakra-sizes-2:0.5rem;--chakra-sizes-3:0.75rem;--chakra-sizes-4:1rem;--chakra-sizes-5:1.25rem;--chakra-sizes-6:1.5rem;--chakra-sizes-7:1.75rem;--chakra-sizes-8:2rem;--chakra-sizes-9:2.25rem;--chakra-sizes-10:2.5rem;--chakra-sizes-12:3rem;--chakra-sizes-14:3.5rem;--chakra-sizes-16:4rem;--chakra-sizes-20:5rem;--chakra-sizes-24:6rem;--chakra-sizes-28:7rem;--chakra-sizes-32:8rem;--chakra-sizes-36:9rem;--chakra-sizes-40:10rem;--chakra-sizes-44:11rem;--chakra-sizes-48:12rem;--chakra-sizes-52:13rem;--chakra-sizes-56:14rem;--chakra-sizes-60:15rem;--chakra-sizes-64:16rem;--chakra-sizes-72:18rem;--chakra-sizes-80:20rem;--chakra-sizes-96:24rem;--chakra-sizes-px:1px;--chakra-sizes-0-5:0.125rem;--chakra-sizes-1-5:0.375rem;--chakra-sizes-2-5:0.625rem;--chakra-sizes-3-5:0.875rem;--chakra-sizes-max:max-content;--chakra-sizes-min:min-content;--chakra-sizes-full:100%;--chakra-sizes-3xs:14rem;--chakra-sizes-2xs:16rem;--chakra-sizes-xs:20rem;--chakra-sizes-sm:24rem;--chakra-sizes-md:28rem;--chakra-sizes-lg:32rem;--chakra-sizes-xl:36rem;--chakra-sizes-2xl:42rem;--chakra-sizes-3xl:48rem;--chakra-sizes-4xl:56rem;--chakra-sizes-5xl:64rem;--chakra-sizes-6xl:72rem;--chakra-sizes-7xl:80rem;--chakra-sizes-8xl:90rem;--chakra-sizes-prose:60ch;--chakra-sizes-container-sm:640px;--chakra-sizes-container-md:768px;--chakra-sizes-container-lg:1024px;--chakra-sizes-container-xl:1280px;--chakra-zIndices-hide:-1;--chakra-zIndices-auto:auto;--chakra-zIndices-base:0;--chakra-zIndices-docked:10;--chakra-zIndices-dropdown:1000;--chakra-zIndices-sticky:1100;--chakra-zIndices-banner:1200;--chakra-zIndices-overlay:1300;--chakra-zIndices-modal:1400;--chakra-zIndices-popover:1500;--chakra-zIndices-skipLink:1600;--chakra-zIndices-toast:1700;--chakra-zIndices-tooltip:1800;--chakra-transition-property-common:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;--chakra-transition-property-colors:background-color,border-color,color,fill,stroke;--chakra-transition-property-dimensions:width,height;--chakra-transition-property-position:left,right,top,bottom;--chakra-transition-property-background:background-color,background-image,background-position;--chakra-transition-easing-ease-in:cubic-bezier(0.4, 0, 1, 1);--chakra-transition-easing-ease-out:cubic-bezier(0, 0, 0.2, 1);--chakra-transition-easing-ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--chakra-transition-duration-ultra-fast:50ms;--chakra-transition-duration-faster:100ms;--chakra-transition-duration-fast:150ms;--chakra-transition-duration-normal:200ms;--chakra-transition-duration-slow:300ms;--chakra-transition-duration-slower:400ms;--chakra-transition-duration-ultra-slow:500ms;--chakra-blur-none:0;--chakra-blur-sm:4px;--chakra-blur-base:8px;--chakra-blur-md:12px;--chakra-blur-lg:16px;
1--chakra-blur-xl:24px;--chakra-blur-2xl:40px;--chakra-blur-3xl:64px;--chakra-breakpoints-base:0em;--chakra-breakpoints-sm:30em;--chakra-breakpoints-md:48em;--chakra-breakpoints-lg:62em;--chakra-breakpoints-xl:80em;--chakra-breakpoints-2xl:96em;}.chakra-ui-light :host:not([data-theme]),.chakra-ui-light :root:not([data-theme]),.chakra-ui-light [data-theme]:not([data-theme]),[data-theme=light] :host:not([data-theme]),[data-theme=light] :root:not([data-theme]),[data-theme=light] [data-theme]:not([data-theme]),:host[data-theme=light],:root[data-theme=light],[data-theme][data-theme=light]{--chakra-colors-chakra-body-text:var(--chakra-colors-gray-800);--chakra-colors-chakra-body-bg:var(--chakra-colors-white);--chakra-colors-chakra-border-color:var(--chakra-colors-gray-200);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-100);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-gray-500);}.chakra-ui-dark :host:not([data-theme]),.chakra-ui-dark :root:not([data-theme]),.chakra-ui-dark [data-theme]:not([data-theme]),[data-theme=dark] :host:not([data-theme]),[data-theme=dark] :root:not([data-theme]),[data-theme=dark] [data-theme]:not([data-theme]),:host[data-theme=dark],:root[data-theme=dark],[data-theme][data-theme=dark]{--chakra-colors-chakra-body-text:var(--chakra-colors-whiteAlpha-900);--chakra-colors-chakra-body-bg:var(--chakra-colors-gray-800);--chakra-colors-chakra-border-color:var(--chakra-colors-whiteAlpha-300);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-700);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-whiteAlpha-400);}</style><style data-emotion="css-global 3kbdol">html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;touch-action:manipulation;}body{position:relative;min-height:100%;font-feature-settings:'kern';}*,*::before,*::after{border-width:0;border-style:solid;box-sizing:border-box;}main{display:block;}hr{border-top-width:1px;box-sizing:content-box;height:0;overflow:visible;}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:1em;}a{background-color:transparent;color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}b,strong{font-weight:bold;}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}button,input{overflow:visible;}button,select{text-transform:none;}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}fieldset{padding:0.35em 0.75em 0.625em;}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}progress{vertical-align:baseline;}textarea{overflow:auto;}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{-webkit-appearance:none!important;}input[type="number"]{-moz-appearance:textfield;}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}[type="search"]::-webkit-search-decoration{-webkit-appearance:none!important;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}details{display:block;}summary{display:-webkit-box;display:-webkit-list-item;display:-ms-list-itembox;display:list-item;}template{display:none;}[hidden]{display:none!important;}body,blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0;}button{background:transparent;padding:0;}fieldset{margin:0;padding:0;}ol,ul{margin:0;padding:0;}textarea{resize:vertical;}button,[role="button"]{cursor:pointer;}button::-moz-focus-inner{border:0!important;}table{border-collapse:collapse;}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit;}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit;}img,svg,video,canvas,audio,iframe,embed,object{display:block;}img,video{max-width:100%;height:auto;}[data-js-focus-visible] :focus:not([data-focus-visible-added]):not
1([data-focus-visible-disabled]){outline:none;box-shadow:none;}select::-ms-expand{display:none;}:root{--chakra-vh:100vh;}@supports (height: -webkit-fill-available){:root{--chakra-vh:-webkit-fill-available;}}@supports (height: -moz-fill-available){:root{--chakra-vh:-moz-fill-available;}}@supports (height: 100dvh){:root{--chakra-vh:100dvh;}}</style><style data-emotion="css-global 1wxmm51">body{font-family:var(--chakra-fonts-body);color:var(--chakra-colors-chakra-body-text);background:var(--chakra-colors-chakra-body-bg);transition-property:background-color;transition-duration:var(--chakra-transition-duration-normal);line-height:var(--chakra-lineHeights-base);}*::-webkit-input-placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*::-moz-placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*:-ms-input-placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*::placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*,*::before,::after{border-color:var(--chakra-colors-chakra-border-color);word-wrap:break-word;}</style><style data-emotion="css 19706bd">.css-19706bd{-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);padding-top:var(--chakra-space-12);padding-bottom:var(--chakra-space-12);}</style><div class="css-19706bd"><style data-emotion="css 1oax8d">.css-1oax8d{width:100%;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);max-width:var(--chakra-sizes-5xl);margin-bottom:100px;}</style><div class="chakra-container css-1oax8d"><style data-emotion="css spn4bz">.css-spn4bz{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;}.css-spn4bz:hover,.css-spn4bz[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-spn4bz:focus-visible,.css-spn4bz[data-focus-visible]{box-shadow:var(--chakra-shadows-outline);}</style><a class="chakra-link css-spn4bz" href="/"><style data-emotion="css qpyn43">.css-qpyn43{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-bold);font-size:var(--chakra-fontSizes-3xl);line-height:1.33;margin-bottom:100px;}@media screen and (min-width: 48em){.css-qpyn43{font-size:var(--chakra-fontSizes-4xl);line-height:1.2;}}</style><h1 class="chakra-heading css-qpyn43">â head back</h1></a><style data-emotion="css 1quvxen">.css-1quvxen{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:var(--chakra-space-3);position:relative;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px;}</style><div class="css-1quvxen"><style data-emotion="css bm0zes">.css-bm0zes{z-index:1;width:100%;position:absolute;height:100%;}</style><div class="css-bm0zes"><style data-emotion="css 1pckkmz">.css-1pckkmz{background-image:radial-gradient(var(--chakra-colors-orange-600) 1px, var(--chakra-colors-transparent) 1px);-webkit-background-size:20px 20px;background-size:20px 20px;opacity:0.4;height:100%;}</style><div class="css-1pckkmz"></div></div></div><style data-emotion="css j0azdm">.css-j0azdm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin-bottom:24px;}</style><div class="css-j0azdm"><style data-emotion="css 7m4n47">.css-7m4n47{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;
1-webkit-justify-content:center;justify-content:center;}</style><div class="css-7m4n47"><style data-emotion="css 3jvujk">.css-3jvujk{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:top;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;font-weight:var(--chakra-fontWeights-medium);line-height:1.2;outline:2px solid transparent;outline-offset:2px;border-radius:var(--chakra-radii-md);min-height:var(--chakra-sizes-6);min-width:var(--chakra-sizes-6);font-size:var(--chakra-fontSizes-sm);-webkit-padding-start:var(--chakra-space-2);padding-inline-start:var(--chakra-space-2);-webkit-padding-end:var(--chakra-space-2);padding-inline-end:var(--chakra-space-2);--badge-bg:var(--chakra-colors-gray-500);--badge-color:var(--chakra-colors-white);background:var(--badge-bg);color:var(--badge-color);background-image:linear-gradient(to top left, #7928CA, #FF0080);margin-right:10px;margin-top:10px;}.css-3jvujk:focus-visible,.css-3jvujk[data-focus-visible]{box-shadow:var(--chakra-shadows-outline);}.chakra-ui-dark .css-3jvujk:not([data-theme]),[data-theme=dark] .css-3jvujk:not([data-theme]),.css-3jvujk[data-theme=dark]{--badge-bg:rgba(113, 128, 150, 0.6);--badge-color:var(--chakra-colors-whiteAlpha-800);}</style><span class="css-3jvujk">blockchain</span><span class="css-3jvujk">scaling</span></div></div><style data-emotion="css zynx8o">.css-zynx8o{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-bold);font-size:var(--chakra-fontSizes-3xl);line-height:1.33;margin-top:var(--chakra-space-1);text-align:center;max-width:100%;margin:0 auto;margin-bottom:var(--chakra-space-8);}@media screen and (min-width: 48em){.css-zynx8o{font-size:var(--chakra-fontSizes-4xl);line-height:1.2;max-width:80%;}}</style><h2 class="chakra-heading css-zynx8o">To DA capacity and beyond</h2><style data-emotion="css 2z8cw6">.css-2z8cw6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin-bottom:48px;}</style><div class="css-2z8cw6"><p class="chakra-text css-0">26/8/2023</p></div></div><style data-emotion="css 1d6pjni">.css-1d6pjni{width:100%;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);max-width:var(--chakra-sizes-2xl);}</style><div class="chakra-container css-1d6pjni"><style data-emotion="css fu5aqi">.css-fu5aqi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin-top:var(--chakra-space-3);}@media screen and (min-width: 30em){.css-fu5aqi{margin-top:0px;}}</style>
1<div class="css-fu5aqi"><div class="markdown-body"><p>I long had this idea about a multi-rollup design that aims to solve some of the problems rollups face today. For about a year and a half I though someone would build it and never really dug into it or considered the specifics of such a system.</p> 2<p>It's been a while now and it seems that there isn't a design that solves the problems I will describe in this post. So, I will try to flesh out as much details as I can about the system in the hope that someone takes inspiration from this or even existing rollups borrow a few ideas.</p> 3<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">Introduction</h3> 4<p>One of the problems rollups face today is <a href="https://www.tzionis.com/the-consumer-chain" target="_blank">user experience</a>. In many designs, rollups come as isolate ecosystems with very different traits. There are some ways to interoperate but with multiple heterogeneous systems wiring them up it's quite a challenge. Moreover, getting users to sign up for all these rollups is hard. They have to learn about each one of them individually, assess the relevant smart contracts, connect their wallet to a new RPC endpoint, bridge assets to the chain etc.</p> 5<p>What if there was a rollup design that can provide a unified experience across the rollups? How would it look like?</p> 6<p>I was asking this question to myself and came to five realizations:</p> 7<ol> 8<li>It <em>should</em> provide a <strong>unified RPC</strong> to query and call smart contracts across different rollups. Smart contracts should have a unique address that does not depend on the rollup they are part of.</li> 9<li>It <em>should</em> allow <strong>scaling up and down</strong> based on demand. More transactions should mean more rollups to process them and uneven load between rollups should be balanced out.</li> 10<li>It <em>should</em> <strong>incentived sequencers</strong> in different rollups to be live. The system should encourage other sequencer to replace sequencers that go offline.</li> 11<li>It <em>should</em> support <strong>instant cross-rollup transactions</strong>. Transactions should settle fast enough that cross chain operations make sense.</li> 12<li>It <em>should</em> maintain <strong>light client and block explorer</strong> functionality across rollups. Block explorers should provide a unified view of the blockchain and light clients should allow to cheaply validate it.</li> 13</ol> 14<div><style data-emotion="css 1vqly2g">.css-1vqly2g{width:800px;height:400px;object-fit:contain;}</style><img alt="Multi rollup draft proposal - Introduction" src="/posts/to-da-capacity-and-beyond/0_intro.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 15<p>With all this in mind, I came up with a design that involves a rollup hub and a variable number of child rollups. The rollup hub acts as both <strong>the registry</strong> and <strong>the load balancer</strong> of all the child rollups but does not do any smart contract processing. Smart contracts are processed in the child rollups instead.</p> 16<p>In the following sections I'll go through a draft design that deals with 5 considerations I mentioned above.</p> 17<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">Design Overview</h3> 18<p>The system has two main components: the rollup hub and the child rollups. The rollup hub is a rollup that contains <strong>a registry of all smart contracts</strong> for all child rollups and is the one that decides which rollups are responsible for which smart contracts. Moreover, the rollup hub contains another <strong>registry of all sequencers</strong> for the child rollups. Child chains are responsible for <a href="https://www.tzionis.com/data-and-execution" target="_blank">executing transactions</a> for the smart contracts the rollup hub assigned them in the smart contract registry. The sequencer registry contains each sequencer RPC endpoint and DA address.</p> 19<div><img alt="Multi rollup draft proposal - Overview" src="/posts/to-da-capacity-and-beyond/1_overview.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 20<p><strong>Sequencers registry:</strong></p> 21<p>The sequencers registry acts as a mapping from the global smart contract addresses to the smart contract addresses. This is used to route RPC calls to the specific sequencer RPCs that correspond to the smart contract that is queried or updated.</p> 22<!-- --> 23<p><strong>Smart contract registry:</strong></p> 24<p>The smart contract registry acts as a mapping from the global smart contract addresses to the smart contract addresses.</p> 25<!-- --> 26<p><strong>Rollup chains:</strong></p> 27<p>The child chains have a <a href="https://consensys.net/blog/blockchain-explained/ethereum-explained-merkle-trees-world-state-transactions-and-more/" target="_blank">state root</a> as they normally do. This state route can be update by calling the smart contract directly but can also be updated when the rollup hub assigns the smart contract to a different rollup. In that case, the smart contract should be removed and should be added to the other smart contract.</p> 28<!-- --> 29<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">A Unified RPC</h3> 30<p><em>Goal:</em> To <strong>not have to connect</strong> to a new chain for every rollup and have transparent to the user cross-rollup transactions</p> 31<p>A unified RPC restores the <a href="https://www.tzionis.com/the-consumer-c
31hain" target="_blank">user experience</a> of a single chain in a multi-rollup world. Users don't have to connect to a <a href="https://www.tzionis.com/crypto-anti-network-effect" target="_blank">different network</a> to use a different rollup.</p> 32<div><img alt="Multi rollup draft proposal - Unified RPC" src="/posts/to-da-capacity-and-beyond/2_unified_rpc.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 33<p>The system uses the registry of the <a href="https://ethereum.org/en/developers/docs/scaling/" target="_blank">rollup sequencers</a> from the rollup hub to find out the RPC endpoint of a sequencer that corresponds to a specific smart contract. The request is then submitted directly to that sequencer. Multiple transactions can be done by submitting requests to different rollups. Check the section below for more details.</p> 34<h4>How it works:</h4> 35<ol> 36<li>The rollup hub keeps a registry of sequencers for all child chains.</li> 37<li>When a user wants to submit a new transaction, the user wallet queries the smart contract registry to get the rollup id of that smart contract and the sequencer registry to get the <a href="https://ethereum.org/en/developers/docs/apis/json-rpc/" target="_blank">RPC endpoint</a> of a sequencer in that same rollup.</li> 38<li>The transaction is then submitted to the RPC endpoint of the sequencer.</li> 39</ol> 40<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">Load balancing</h3> 41<p><em>Goal:</em> To have <strong>balanced out fees</strong> across all rollups</p> 42<p>Load balancing allows to balances the load across the rollups. When the system is jammed, new rollups can be spawned to handle the load. When there's no much usage rollups can be removed to save resources. Moreover the system could avoid <a href="https://ycharts.com/indicators/ethereum_average_transaction_fee" target="_blank">fee spikes</a> by moving smart contracts with high demand in transactions to rollups that more available capacity.</p> 43<div><img alt="Multi rollup draft proposal - Load balancing" src="/posts/to-da-capacity-and-beyond/3_load_balancing.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 44<h4>How it works:</h4> 45<ol> 46<li>Every epoch the rollup hub evaluates the load of all the rollups in the system. Epochs should last a few hours (possibly 6 to 24) to avoid extensive smart contracts reassignments.</li> 47<li>The rollup hub can decide which smart contracts to reassign and when to spawn or remove rollups with governance or autonomously using the <a href="https://ethereum.org/en/developers/docs/gas/" target="_blank">gas consumption</a> history of different smart contracts.</li> 48<li>The rollup hub checks if any rollup has <em>above average</em> transaction load and (ie. very high fees) or has <em>below average</em> transaction load (ie. very low fees). 49<ul> 50<li>If one rollup has <em>above average</em> load, the rollup hub evaluates which smart contracts are <a href="https://ethereum.org/en/developers/docs/gas/" target="_blank">consuming the most gas</a> and reassigns them to a different rollup that can afford the extra load. Smart contracts are then dropped from their initial host rollup <a href="https://consensys.net/blog/blockchain-explained/ethereum-explained-merkle-trees-world-state-transactions-and-more/" target="_blank">state</a>.</li> 51<li>If the average load is <em>above average</em> in all rollups, the rollup hub creates a new rollup and assigns a few smart contract to the new rollup. Similarly, if the average load in all rollups is <em>below average</em>, the rollup hub drops one rollup and reassigns its smart contracts to the other rollups.</li> 52</ul> 53</li> 54<li>Rollup chains should look into the rollup hub at every epoch and download the storage of any new smart contracts they are assigned to and drop any smart contracts they are not responsible for anymore.</li> 55</ol> 56<p><strong>Note:</strong> Downloading the storage of some smart contracts might not be a trivial task. At first the state is not available on the DA layer and is quite large in size. This puts bounds on the minimum epoch time that would need a grace peri
56od to prepare that smart contract storage.</p> 57<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">Sequencer incentives</h3> 58<p><em>Goal:</em> Having <strong>standby sequencers</strong> that are <strong>incentivize</strong> with partial rewards in the native token</p> 59<p>Most <a href="https://ethereum.org/en/developers/docs/scaling/" target="_blank">rollups</a> today are built on a single chain and have a single or very few sequencers to manage with the goal of <a href="https://l2beat.com/scaling/summary" target="_blank">maximizing rollup uptime</a>. In contrast, in a multi rollup system, there multiple standalone child rollups that each have to be online to have liveness across the whole system.</p> 60<p>Sequencers are naturally incentivized to join rollups to collect MEV but it's better to have proper rewards for these sequencers since they are more consistent and don't miss-aligned incentive as MEV does. These rewards should come from the rollup hub <a href="https://eips.ethereum.org/EIPS/eip-1559" target="_blank">monetary policy</a>.</p> 61<p>Moreover, it's better to have a few sequencers on standby and ready to be enter. These sequencers can join when there's an increase in transaction demand and leave the system when there's not to save computational resources.</p> 62<div><img alt="Multi rollup draft proposal - Sequencer incentives" src="/posts/to-da-capacity-and-beyond/5_sequencer_incentives.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 63<p>The standby sequencers will stay in a sequencer queue and get a small amount of rewards for there availability commitment. When they are swapped in in a rollup they will get the full amount. Rewards will come from a <a href="https://eips.ethereum.org/EIPS/eip-1559" target="_blank">fee burning mechanism</a> in the rollup hub.</p> 64<h4>How it works:</h4> 65<ol> 66<li>Sequencers can join the sequencer queue in the rollup hub by committing to a <a href="https://ethereum.org/en/developers/docs/scaling/optimistic-rollups/" target="_blank">financial bond</a> (similarly to current rollup systems).</li> 67<li>The sequencers in the queue are required to provide <a href="https://ethereum.org/en/developers/docs/data-availability/" target="_blank">DA proofs</a> that they have the rollup hub state and are read to join a rollup anytime.</li> 68<li>When they submit proofs they will get partial rewards in the native token of the system. That token is handle on the rollup hub.</li> 69<li>If the rollup hub decides that a new rollup is needed they will get assigned and get paid the full reward. That reward is determined by the amount of total fees burned in the system.</li> 70</ol> 71<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">Cross-rollup transactions</h3> 72<p><em>Goal:</em> Cross-rollup transactions should be <strong>instant and transparent</strong> to the user</p> 73<p>A cross-rollup transaction between rollup A and rollup B needs to have 2 parts: 1) a transaction on rollup A and 2) a transaction on rollup B that only happens if the transaction on rollup A has succeeded and is final.</p> 74<div><img alt="Multi rollup draft proposal - Cross chain transaction" src="/posts/to-da-capacity-and-beyond/4_cross_chain.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 75<p>To get fast confirmations the user wallet can check whether the transaction is both submitted to the underlying <a href="https://www.tzionis.com/on-chain-storage" target="_blank">DA layer</a> and is valid using <a href="https://ethereum.org/en/developers/docs/scaling/zk-rollups/" target="_blank">ZK proofs</a>. If a transaction is both included and valid then the sequencers have to reach the <a href="https://blog.celestia.org/sovereign-rollup-chains/" target="_blank">same conclusion</a> about that particular transaction.</p> 76<p>Credits to <a href="https://en.wikipedia.org/wiki/Mustafa_Al-Bassam" target="_blank">Mustafa Al-Bassam</a> and <a href="https://github.com/Sovereign-Labs/sovereign-sdk" target="_blank">Sovereign Labs</a> for the idea.</p> 77<h4>How it works:</h4> 78<ol> 79<li>A user submits a transaction that involves 3 rollups, say rollup A, B and C.</li> 80<li>Let's consider a specific example. Rollup A has a stablecoin smart contract, rollup B has a DEX and rollup C has a lending protocol. In this example, the user wants to convert their stablecoins to a different c
80oin to deposit it to the lending protocol.</li> 81<li>The user has to first submit the rollup A transaction that transfers the stablecoins to the DEX on rollup B.</li> 82<li>Then they can submit the rollup B DEX transaction that takes the stablecoins and converts them to the desired token on rollup B.</li> 83<li>That token should then be transferred to the rollup C and so the user submits a 3rd transaction that does exactly that.</li> 84<li>Finally the user submits a 4th and final transaction that deposits the token to the lending protocol.</li> 85</ol> 86<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">Light nodes and block explorers</h3> 87<p><em>Goal:</em> Light nodes should be able to <strong>validate a smart contract</strong> across rollups and block explorers should provide a unified view of the chain</p> 88<p>A blockchain system should allow anyone to run a node and verify the chain themselves. In this multi-rollup design, smart contracts are constantly reassigned to different child rollups and there should be a way to follow these specific smart contracts across. That's a mental shift from validating one or more chains to validating one or more smart contracts. Light nodes can utilize ZK proofs to cheaply validate all child rollups.</p> 89<div><img alt="Multi rollup draft proposal - Light nodes" src="/posts/to-da-capacity-and-beyond/6_light_nodes.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 90<h4>How it works (light clients):</h4> 91<ol> 92<li>Rollup nodes should support a verifying mode along sequencer mode.</li> 93<li>Verifying mode validates the state of a single smart contract and does not submit transaction batches to the <a href="https://www.tzionis.com/on-chain-storage" target="_blank">DA layer</a> as the sequencer mode does.</li> 94<li>If the smart contract changes child rollup, verifying node have to only update the child rollup they listen to for changes. That's because they already have the smart contract storage up to the point before the reassignment.</li> 95<li>Smart contracts are meant to be processed in one rollup at a time. Since they are confined in one rollup verifying nodes with the same specs should be able to follow and verify them.</li> 96<li>Light node can cheaply verify the state of the chain with ZK proofs.</li> 97</ol> 98<p>Block explorers are an integral part of a blockchain system. They facilitate balance queries for the native asset, smart contract queries and maintain transaction history from the first block to the current one. In this multi-rollup system, a block explorer should provide a unified view across all child rollups.</p> 99<div><img alt="Multi rollup draft proposal - Block explorers" src="/posts/to-da-capacity-and-beyond/7_block_explorers.svg" width="800" height="400" decoding="async" data-nimg="1" class="css-1vqly2g" loading="lazy" style="color:transparent"/></div> 100<h4>How it works (block explorers):</h4> 101<ol> 102<li>Block explorers should support to query balances (for the native asset) on the rollup hub and transaction history for all child rollups.</li> 103<li>Similarly to single-rollup systems, block explorers enable this using an index. Multi-rollup systems have to index all rollups to be prepared to serve queries for any smart contract in the system.</li> 104<li>If the rollup hub decides to to scale up the number of child rollups, block explorers should be prepared to handle it. They should either provision for more child rollup capacity or have a container orchestration system (eg. Kubernetes) to automatically scaling up the child rollups.</li> 105<li>They should use the block number from the <a href="https://www.tzionis.com/on-chain-storage" target="_blank">DA layer</a> to provide consistency across all rollups.</li> 106</ol> 107<h3 style="font-size:24px;margin:32px 0 24px 0" level="3">Conclusion</h3> 108<p>Right now this design is just an idea and I might never pursue it further, yet, I hope you found it interesting. If the design check out, I'm looking forward to rollup project utilize it and approach <a href="https://eips.ethereum.org/EIPS/eip-4844" target="_blank">EIP-4844</a>, <a href="https://arxiv.org/abs/1905.09274" target="_blank">Celestia</a> or <a href="https://github.com/availproject/data-availability/blob/2f3c8c395b163576f79b6ec24b343a4ff182172a/reference%20document/Data%20Availability%20-%20Reference%20Document.pdf" target="_blank">Avail</a> capacity.</p> 109<p>If you think there's a flaw somewhere or the design is problematic feel free to let me know.</p></div></div></div><style data-emotion="css 16ts2ud">.css-16ts2ud{width:100%;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);max-width:var(--chakra-sizes-2xl);margin-top:60px;}</style><div class="chakra-container css-16ts2ud"><style data-emotion="css 1jb3vzl">.css-1jb3vzl{font-family:var(--chakra-fonts-heading);font-weight:var(--chakra-fontWeights-bold);font-size:var(--chakra-fontSizes-2xl);line-height:1.33;}@media screen and (min-width: 48em){.css-1jb3vzl{font-size:var(--chakra-fontSizes-3xl);line-height:1.2;}}</style><h2 class="chakra-heading css-1jb3vzl">Related Posts</h2><style data-emotion="css hggsj6">.css-hggsj6{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-top:var(--chakra-space-4);}</style><div class="css-hggsj6"><div class="css-0"><a class="chakra-link css-spn4bz" href="bitcoin-protocol-in-45-minutes"><style data-emotion="css 6r4ark">.css-6r4ark{font-size:var(--chakra-fontSizes-lg);margin-bottom:var(--chakra-space-2);}</style><p class="chakra-text css-6r4ark">Bitcoin Protocol in 45 minutes</p></a></div><div class="css-0"><a class="chakra-link css-spn4bz" href="bittorrent-protocol-in-25-minutes"><p class="chakra-text css-6r4ark">BitTorrent Protocol in 25 minutes</p></a></div><div class="css-0"><a class="chakra-link css-spn4bz" href="blockchain-framework"><p class="chakra-text css-6r4ark">A framework for blockchains</p></a></div></div></div></div><style data-emotion="css 1b5p6pp">.css-1b5p6pp{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;
109-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:var(--chakra-space-4);}@media screen and (min-width: 48em){.css-1b5p6pp{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}}</style><div class="css-1b5p6pp"><style data-emotion="css 409ltu">.css-409ltu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin:var(--chakra-space-2);}.css-409ltu>*:not(style)~*:not(style){margin-top:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-bottom:0px;-webkit-margin-start:var(--chakra-space-2);margin-inline-start:var(--chakra-space-2);}</style><div class="chakra-stack css-409ltu"><style data-emotion="css eefv6g">.css-eefv6g{font-weight:var(--chakra-fontWeights-thin);}</style><p class="chakra-text css-eefv6g">Andreas Tzionis @ </p><style data-emotion="css spn4bz">.css-spn4bz{transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-fast);transition-timing-function:var(--chakra-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:none;text-decoration:none;outline:2px solid transparent;outline-offset:2px;color:inherit;}.css-spn4bz:hover,.css-spn4bz[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-spn4bz:focus-visible,.css-spn4bz[data-focus-visible]{box-shadow:var(--chakra-shadows-outline);}</style><a target="_blank" class="chakra-link css-spn4bz" href="https://github.com/LiveDuo"><style data-emotion="css 1bsgmhw">.css-1bsgmhw{font-weight:var(--chakra-fontWeights-medium);}</style><p class="chakra-text css-1bsgmhw">Github</p></a><a target="_blank" class="chakra-link css-spn4bz" href="https://twitter.com/andreas_tzionis"><p class="chakra-text css-1bsgmhw">Twitter</p></a><a target="_blank" class="chakra-link css-spn4bz" href="https://www.linkedin.com/in/andreas-tzionis/"><p class="chakra-text css-1bsgmhw">LinkedIn</p></a></div><div class="chakra-stack css-409ltu"><a target="_blank" class="chakra-link css-spn4bz" href="https://github.com/LiveDuo/destack"><p class="chakra-text css-eefv6g">Destack</p></a><a target="_blank" class="chakra-link css-spn4bz" href="https://www.ondiagram.com"><p class="chakra-text css-eefv6g">Diagram</p></a><a target="_blank" class="chakra-link css-spn4bz" href="https://www.prettyfunnels.com"><p class="chakra-text css-eefv6g">Pretty Funnels</p></a></div></div><span></span><span id="__chakra_env" hidden=""></span></div>
109<script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"slug":"to-da-capacity-and-beyond","post":{"content":"\nI long had this idea about a multi-rollup design that aims to solve some of the problems rollups face today. For about a year and a half I though someone would build it and never really dug into it or considered the specifics of such a system.\n\nIt's been a while now and it seems that there isn't a design that solves the problems I will describe in this post. So, I will try to flesh out as much details as I can about the system in the hope that someone takes inspiration from this or even existing rollups borrow a few ideas.\n\n### Introduction\n\nOne of the problems rollups face today is [user experience](https://www.tzionis.com/the-consumer-chain). In many designs, rollups come as isolate ecosystems with very different traits. There are some ways to interoperate but with multiple heterogeneous systems wiring them up it's quite a challenge. Moreover, getting users to sign up for all these rollups is hard. They have to learn about each one of them individually, assess the relevant smart contracts, connect their wallet to a new RPC endpoint, bridge assets to the chain etc.\n\nWhat if there was a rollup design that can provide a unified experience across the rollups? How would it look like?\n\nI was asking this question to myself and came to five realizations:\n\n1. It *should* provide a **unified RPC** to query and call smart contracts across different rollups. Smart contracts should have a unique address that does not depend on the rollup they are part of.\n2. It *should* allow **scaling up and down** based on demand. More transactions should mean more rollups to process them and uneven load between rollups should be balanced out.\n3. It *should* **incentived sequencers** in different rollups to be live. The system should encourage other sequencer to replace sequencers that go offline.\n4. It *should* support **instant cross-rollup transactions**. Transactions should settle fast enough that cross chain operations make sense.\n5. It *should* maintain **light client and block explorer** functionality across rollups. Block explorers should provide a unified view of the blockchain and light clients should allow to cheaply validate it.\n\n\n\nWith all this in mind, I came up with a design that involves a rollup hub and a variable number of child rollups. The rollup hub acts as both **the registry** and **the load balancer** of all the child rollups but does not do any smart contract processing. Smart contracts are processed in the child rollups instead.\n\nIn the following sections I'll go through a draft design that deals with 5 considerations I mentioned above.\n\n\n### Design Overview\n\nThe system has two main components: the rollup hub and the child rollups. The rollup hub is a rollup that contains **a registry of all smart contracts** for all child rollups and is the one that decides which rollups are responsible for which smart contracts. Moreover, the rollup hub contains another **registry of all sequencers** for the child rollups. Child chains are responsible for [executing transactions](https://www.tzionis.com/data-and-execution) for the smart contracts the rollup hub assigned them in the smart contract registry. The sequencer registry contains each sequencer RPC endpoint and DA address.\n\n\n\n**Sequencers registry:**\n\nThe sequencers registry acts as a mapping from the global smart contract addresses to the smart contract addresses. This is used to route RPC calls to the specific sequencer RPCs that correspond to the smart contract that is queried or updated.\n\n\u003c!-- ```rust\ntype RollupId = [u8]\nstruct SequencerInfo { sequencer_rpc: String, da_address: String }\nstruct SequencerRegistry { registry: HashMap\u003cRollupId, Vec\u003cSequencerInfo\u003e\u003e }\n``` --\u003e\n\n**Smart contract registry:**\n\nThe smart contract registry acts as a mapping from the global smart contract addresses to the smart contract addresses.\n\n\u003c!-- ```rust\nstruct SmartContractRegistry { registry: HashMap\u003cR
109ollupId, Address\u003e }\n``` --\u003e\n\n**Rollup chains:**\n\nThe child chains have a [state root](https://consensys.net/blog/blockchain-explained/ethereum-explained-merkle-trees-world-state-transactions-and-more/) as they normally do. This state route can be update by calling the smart contract directly but can also be updated when the rollup hub assigns the smart contract to a different rollup. In that case, the smart contract should be removed and should be added to the other smart contract.\n\n\u003c!-- ```rust\ntype StateRoot = [u8] // hash(account balances and smart contract data)\n``` --\u003e\n\n\n### A Unified RPC\n\n\n*Goal:* To **not have to connect** to a new chain for every rollup and have transparent to the user cross-rollup transactions\n\nA unified RPC restores the [user experience](https://www.tzionis.com/the-consumer-chain) of a single chain in a multi-rollup world. Users don't have to connect to a [different network](https://www.tzionis.com/crypto-anti-network-effect) to use a different rollup.\n\n\n\nThe system uses the registry of the [rollup sequencers](https://ethereum.org/en/developers/docs/scaling/) from the rollup hub to find out the RPC endpoint of a sequencer that corresponds to a specific smart contract. The request is then submitted directly to that sequencer. Multiple transactions can be done by submitting requests to different rollups. Check the section below for more details.\n\n#### How it works:\n1. The rollup hub keeps a registry of sequencers for all child chains.\n2. When a user wants to submit a new transaction, the user wallet queries the smart contract registry to get the rollup id of that smart contract and the sequencer registry to get the [RPC endpoint](https://ethereum.org/en/developers/docs/apis/json-rpc/) of a sequencer in that same rollup.\n3. The transaction is then submitted to the RPC endpoint of the sequencer.\n\n\n### Load balancing\n\n*Goal:* To have **balanced out fees** across all rollups\n\nLoad balancing allows to balances the load across the rollups. When the system is jammed, new rollups can be spawned to handle the load. When there's no much usage rollups can be removed to save resources. Moreover the system could avoid [fee spikes](https://ycharts.com/indicators/ethereum_average_transaction_fee) by moving smart contracts with high demand in transactions to rollups that more available capacity.\n\n\n\n#### How it works:\n\n1. Every epoch the rollup hub evaluates the load of all the rollups in the system. Epochs should last a few hours (possibly 6 to 24) to avoid extensive smart contracts reassignments.\n2. The rollup hub can decide which smart contracts to reassign and when to spawn or remove rollups with governance or autonomously using the [gas consumption](https://ethereum.org/en/developers/docs/gas/) history of different smart contracts.\n3. The rollup hub checks if any rollup has *above average* transaction load and (ie. very high fees) or has *below average* transaction load (ie. very low fees).\n - If one rollup has *above average* load, the rollup hub evaluates which smart contracts are [consuming the most gas](https://ethereum.org/en/developers/docs/gas/) and reassigns them to a different rollup that can afford the extra load. Smart contracts are then dropped from their initial host rollup [state](https://consensys.net/blog/blockchain-explained/ethereum-explained-merkle-trees-world-state-transactions-and-more/).\n - If the average load is *above average* in all rollups, the rollup hub creates a new rollup and assigns a few smart contract to the new rollup. Similarly, if the average load in all rollups is *below average*, the rollup hub drops one rollup and reassigns its smart contracts to the other rollups.\n5. Rollup chains should look into the rollup hub at every epoch and download the storage of any new smart contracts they are assigned to and drop any smart contracts they are not responsible for anymore.\n\n**Note:** Downloading the storage of some smart contracts might not be a trivial task. At first the state is not available on the DA layer and is quite large in size. This puts bounds on the minimum epoch time that would need a grace peri
109od to prepare that smart contract storage.\n\n\n### Sequencer incentives\n\n*Goal:* Having **standby sequencers** that are **incentivize** with partial rewards in the native token\n\nMost [rollups](https://ethereum.org/en/developers/docs/scaling/) today are built on a single chain and have a single or very few sequencers to manage with the goal of [maximizing rollup uptime](https://l2beat.com/scaling/summary). In contrast, in a multi rollup system, there multiple standalone child rollups that each have to be online to have liveness across the whole system.\n\nSequencers are naturally incentivized to join rollups to collect MEV but it's better to have proper rewards for these sequencers since they are more consistent and don't miss-aligned incentive as MEV does. These rewards should come from the rollup hub [monetary policy](https://eips.ethereum.org/EIPS/eip-1559).\n\nMoreover, it's better to have a few sequencers on standby and ready to be enter. These sequencers can join when there's an increase in transaction demand and leave the system when there's not to save computational resources.\n\n\n\nThe standby sequencers will stay in a sequencer queue and get a small amount of rewards for there availability commitment. When they are swapped in in a rollup they will get the full amount. Rewards will come from a [fee burning mechanism](https://eips.ethereum.org/EIPS/eip-1559) in the rollup hub.\n\n#### How it works:\n\n1. Sequencers can join the sequencer queue in the rollup hub by committing to a [financial bond](https://ethereum.org/en/developers/docs/scaling/optimistic-rollups/) (similarly to current rollup systems).\n2. The sequencers in the queue are required to provide [DA proofs](https://ethereum.org/en/developers/docs/data-availability/) that they have the rollup hub state and are read to join a rollup anytime.\n3. When they submit proofs they will get partial rewards in the native token of the system. That token is handle on the rollup hub.\n4. If the rollup hub decides that a new rollup is needed they will get assigned and get paid the full reward. That reward is determined by the amount of total fees burned in the system.\n\n\n### Cross-rollup transactions\n\n*Goal:* Cross-rollup transactions should be **instant and transparent** to the user\n\nA cross-rollup transaction between rollup A and rollup B needs to have 2 parts: 1) a transaction on rollup A and 2) a transaction on rollup B that only happens if the transaction on rollup A has succeeded and is final.\n\n\n\nTo get fast confirmations the user wallet can check whether the transaction is both submitted to the underlying [DA layer](https://www.tzionis.com/on-chain-storage) and is valid using [ZK proofs](https://ethereum.org/en/developers/docs/scaling/zk-rollups/). If a transaction is both included and valid then the sequencers have to reach the [same conclusion](https://blog.celestia.org/sovereign-rollup-chains/) about that particular transaction.\n\nCredits to [Mustafa Al-Bassam](https://en.wikipedia.org/wiki/Mustafa_Al-Bassam) and [Sovereign Labs](https://github.com/Sovereign-Labs/sovereign-sdk) for the idea.\n\n#### How it works:\n1. A user submits a transaction that involves 3 rollups, say rollup A, B and C.\n2. Let's consider a specific example. Rollup A has a stablecoin smart contract, rollup B has a DEX and rollup C has a lending protocol. In this example, the user wants to convert their stablecoins to a different coin to deposit it to the lending protocol.\n2. The user has to first submit the rollup A transaction that transfers the stablecoins to the DEX on rollup B.\n3. Then they can submit the rollup B DEX transaction that takes the stablecoins and converts them to the desired token on rollup B.\n4. That token should then be transferred to the rollup C and so the user submits a 3rd transaction that does exactly that.\n5. Finally the user submits a 4th and final transaction that deposits the token to the lending protocol.\n\n\n### Light nodes and block explorers\n\n*Goal:* Light nodes should be able to **validate a smart contract** across rollups and block explorers should provide a unified view of the chain\n\nA blockchain system should allow anyone to run a no
109de and verify the chain themselves. In this multi-rollup design, smart contracts are constantly reassigned to different child rollups and there should be a way to follow these specific smart contracts across. That's a mental shift from validating one or more chains to validating one or more smart contracts. Light nodes can utilize ZK proofs to cheaply validate all child rollups.\n\n\n\n#### How it works (light clients):\n1. Rollup nodes should support a verifying mode along sequencer mode.\n2. Verifying mode validates the state of a single smart contract and does not submit transaction batches to the [DA layer](https://www.tzionis.com/on-chain-storage) as the sequencer mode does.\n3. If the smart contract changes child rollup, verifying node have to only update the child rollup they listen to for changes. That's because they already have the smart contract storage up to the point before the reassignment.\n4. Smart contracts are meant to be processed in one rollup at a time. Since they are confined in one rollup verifying nodes with the same specs should be able to follow and verify them.\n5. Light node can cheaply verify the state of the chain with ZK proofs.\n\nBlock explorers are an integral part of a blockchain system. They facilitate balance queries for the native asset, smart contract queries and maintain transaction history from the first block to the current one. In this multi-rollup system, a block explorer should provide a unified view across all child rollups.\n\n\n\n#### How it works (block explorers):\n1. Block explorers should support to query balances (for the native asset) on the rollup hub and transaction history for all child rollups.\n2. Similarly to single-rollup systems, block explorers enable this using an index. Multi-rollup systems have to index all rollups to be prepared to serve queries for any smart contract in the system.\n3. If the rollup hub decides to to scale up the number of child rollups, block explorers should be prepared to handle it. They should either provision for more child rollup capacity or have a container orchestration system (eg. Kubernetes) to automatically scaling up the child rollups.\n4. They should use the block number from the [DA layer](https://www.tzionis.com/on-chain-storage) to provide consistency across all rollups.\n\n\n### Conclusion\n\nRight now this design is just an idea and I might never pursue it further, yet, I hope you found it interesting. If the design check out, I'm looking forward to rollup project utilize it and approach [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), [Celestia](https://arxiv.org/abs/1905.09274) or [Avail](https://github.com/availproject/data-availability/blob/2f3c8c395b163576f79b6ec24b343a4ff182172a/reference%20document/Data%20Availability%20-%20Reference%20Document.pdf) capacity.\n\nIf you think there's a flaw somewhere or the design is problematic feel free to let me know.\n","slug":"to-da-capacity-and-beyond","data":{"title":"To DA capacity and beyond","subtitle":"A draft design of a multi rollup system.","tags":["blockchain","scaling"],"date":1693008000000,"published":true},"isEmpty":false,"excerpt":"","orig":0},"relatedPosts":[{"title":"Bitcoin Protocol in 45 minutes","slug":"bitcoin-protocol-in-45-minutes"},{"title":"BitTorrent Protocol in 25 minutes","slug":"bittorrent-protocol-in-25-minutes"},{"title":"A framework for blockchains","slug":"blockchain-framework"}]},"__N_SSG":true},"page":"/[slug]","query":{"slug":"to-da-capacity-and-beyond"},"buildId":"lTTgvjFePycNwogzJDGnr","isFallback":false,"gsp":true,"scriptLoader":[]}</script>
109</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.