Files
tendermint/master/spec/abci/apps.html

319 lines
104 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Applications | Tendermint Core</title>
<meta name="generator" content="VuePress 1.9.7">
<meta name="description" content="">
<link rel="preload" href="/master/assets/css/0.styles.3ed5e0a6.css" as="style"><link rel="preload" href="/master/assets/js/app.d8230444.js" as="script"><link rel="preload" href="/master/assets/js/24.7da7f2cf.js" as="script"><link rel="preload" href="/master/assets/js/21.92fb7737.js" as="script"><link rel="preload" href="/master/assets/js/44.a966f787.js" as="script"><link rel="preload" href="/master/assets/js/19.a758649d.js" as="script"><link rel="preload" href="/master/assets/js/66.1a996a52.js" as="script"><link rel="preload" href="/master/assets/js/64.602a26f4.js" as="script"><link rel="preload" href="/master/assets/js/65.224ad1ec.js" as="script"><link rel="preload" href="/master/assets/js/25.c1f919e6.js" as="script"><link rel="preload" href="/master/assets/js/56.714e246c.js" as="script"><link rel="preload" href="/master/assets/js/62.c200562d.js" as="script"><link rel="preload" href="/master/assets/js/40.bbfd2b95.js" as="script"><link rel="preload" href="/master/assets/js/10.3cf8ba3a.js" as="script"><link rel="preload" href="/master/assets/js/7.c795f92d.js" as="script"><link rel="preload" href="/master/assets/js/184.681becb1.js" as="script"><link rel="preload" href="/master/assets/js/2.21a3b73d.js" as="script"><link rel="preload" href="/master/assets/js/5.4af69dfc.js" as="script"><link rel="preload" href="/master/assets/js/38.933ad5bd.js" as="script"><link rel="preload" href="/master/assets/js/13.cd4f8d8e.js" as="script"><link rel="preload" href="/master/assets/js/12.cf95ee24.js" as="script"><link rel="preload" href="/master/assets/js/16.e0a6886e.js" as="script"><link rel="preload" href="/master/assets/js/45.1110ab59.js" as="script"><link rel="preload" href="/master/assets/js/20.c6a2fb05.js" as="script"><link rel="prefetch" href="/master/assets/js/100.5cc5b1c5.js"><link rel="prefetch" href="/master/assets/js/101.b1686c25.js"><link rel="prefetch" href="/master/assets/js/102.a77f09ff.js"><link rel="prefetch" href="/master/assets/js/103.628a973b.js"><link rel="prefetch" href="/master/assets/js/104.adff3890.js"><link rel="prefetch" href="/master/assets/js/105.5ce65b7f.js"><link rel="prefetch" href="/master/assets/js/106.4eea6346.js"><link rel="prefetch" href="/master/assets/js/107.b576d87a.js"><link rel="prefetch" href="/master/assets/js/108.104f5ed5.js"><link rel="prefetch" href="/master/assets/js/109.b15e9151.js"><link rel="prefetch" href="/master/assets/js/11.00f01e88.js"><link rel="prefetch" href="/master/assets/js/110.0934a099.js"><link rel="prefetch" href="/master/assets/js/111.47e9b185.js"><link rel="prefetch" href="/master/assets/js/112.97ab0e05.js"><link rel="prefetch" href="/master/assets/js/113.55b9e637.js"><link rel="prefetch" href="/master/assets/js/114.e6d24a0b.js"><link rel="prefetch" href="/master/assets/js/115.ae115651.js"><link rel="prefetch" href="/master/assets/js/116.dc5b6048.js"><link rel="prefetch" href="/master/assets/js/117.eb7f1121.js"><link rel="prefetch" href="/master/assets/js/118.3c73b8f0.js"><link rel="prefetch" href="/master/assets/js/119.e78eaee1.js"><link rel="prefetch" href="/master/assets/js/120.3e622c8d.js"><link rel="prefetch" href="/master/assets/js/121.e9172ca7.js"><link rel="prefetch" href="/master/assets/js/122.2477faff.js"><link rel="prefetch" href="/master/assets/js/123.3858ea7c.js"><link rel="prefetch" href="/master/assets/js/124.ae4bf284.js"><link rel="prefetch" href="/master/assets/js/125.f19a08b1.js"><link rel="prefetch" href="/master/assets/js/126.dbab3f37.js"><link rel="prefetch" href="/master/assets/js/127.49556a1a.js"><link rel="prefetch" href="/master/assets/js/128.56bf99ca.js"><link rel="prefetch" href="/master/assets/js/129.ee765751.js"><link rel="prefetch" href="/master/assets/js/130.e5c849d4.js"><link rel="prefetch" href="/master/assets/js/131.a480108f.js"><link rel="prefetch" href="/master/assets/js/132.7eb3a84d.js"><link rel="prefetch" href="/master/assets/js/133.15232f8a.js"><link rel="prefetch" href="/master/assets/js/134.a91c8722.js"><link rel="prefetch" href="/master/assets/js/135.616bb5ec.js"><link rel="prefetch" href="/master/assets/js/136.ea8b592e.js"><link rel="prefetch" href="/master/assets/js/137.4cd52167.js"><link rel="prefetch" href="/master/assets/js/138.a78dd2df.js"><link rel="prefetch" href="/master/assets/js/139.920add1b.js"><link rel="prefetch" href="/master/assets/js/14.54477264.js"><link rel="prefetch" href="/master/assets/js/140.a5b807fb.js"><link rel="prefetch" href="/master/assets/js/141.723d107b.js"><link rel="prefetch" href="/master/assets/js/142.476214d4.js"><link rel="prefetch" href="/master/assets/js/143.686ce60b.js"><link rel="prefetch" href="/master/assets/js/144.c0d5b563.js"><link rel="prefetch" href="/master/assets/js/145.6612f3a3.js"><link rel="prefetch" href="/master/assets/js/146.2d5b17d6.js"><link rel="prefetch" href="/master/assets/js/147.acbb86d8.js"><link rel="prefetch" href="/master/assets/js/148.0cbee9ba.js"><link rel="prefetch" href="/master/assets/js/149.b6267cfe.js"><link rel="prefetch" href="/master/assets/js/15.fd025618.js"><link rel="prefetch" href="/master/assets/js/150.d31241cd.js"><link rel="prefetch" href="/master/assets/js/151.c495db3c.js"><link rel="prefetch" href="/master/assets/js/152.dc828f50.js"><link rel="prefetch" href="/master/assets/js/153.c771569c.js"><link rel="prefetch" href="/master/assets/js/154.abd87751.js"><link rel="prefetch" href="/master/assets/js/155.30665cc5.js"><link rel="prefetch" href="/master/assets/js/156.9f90939a.js"><link rel="prefetch" href="/master/assets/js/157.c8770fc9.js"><link rel="prefetch" href="/master/assets/js/158.bfcecfc8.js"><link rel="prefetch" href="/master/assets/js/159.a60c2f65.js"><link rel="prefetch" href="/master/assets/js/160.a2bdf37d.js"><link rel="prefetch" href="/master/assets/js/161.3034a0ff.js"><link rel="prefetch" href="/master/assets/js/162.27ac6ca6.js"><link rel="prefetch" href="/master/assets/js/163.d9cd6b68.js"><link rel="prefetch" href="/master/assets/js/164.ce8d8e42.js"><link rel="prefetch" href="/master/assets/js/165.eeca2c68.js"><link rel="prefetch" href="/master/assets/js/166.6a7f0cc2.js"><link rel="prefetch" href="/master/assets/js/167.29e50517.js"><link rel="prefetch" href="/master/assets/js/168.ad3e026b.js"><link rel="prefetch" href="/master/assets/js/169.53785d6d.js"><link rel="prefetch" href="/master/assets/js/17.60b16410.js"><link rel="prefetch" href="/master/assets/js/170.b6a4a563.js"><link rel="prefetch" href="/master/assets/js/171.7526d6a5.js"><link rel="prefetch" href="/master/assets/js/172.cd0d0c49.js"><link rel="prefetch" href="/master/assets/js/173.35504fc2.js"><link rel="prefetch" href="/master/assets/js/174.cc976f2e.js"><link rel="prefetch" href="/master/assets/js/175.0b4facea.js"><link rel="prefetch" href="/master/assets/js/176.12a12fc4.js"><link rel="prefetch" href="/master/assets/js/177.630fd5cd.js"><link rel="prefetch" href="/master/assets/js/178.ba8a329b.js"><link rel="prefetch" href="/master/assets/js/179.7fb5d9b0.js"><link rel="prefetch" href="/master/assets/js/18.70b108cc.js"><link rel="prefetch" href="/master/assets/js/180.0d724be1.js"><link rel="prefetch" href="/master/assets/js/181.0e208788.js"><link rel="prefetch" href="/master/assets/js/182.553ee2b1.js"><link rel="prefetch" href="/master/assets/js/183.a6f8527e.js"><link rel="prefetch" href="/master/assets/js/185.2d4a9a49.js"><link rel="prefetch" href="/master/assets/js/186.0497565b.js"><link rel="prefetch" href="/master/assets/js/187.baf6f121.js"><link rel="prefetch" href="/master/assets/js/188.5a222747.js"><link rel="prefetch" href="/master/assets/js/189.a7c824fa.js"><link rel="prefetch" href="/master/assets/js/190.2642eb15.js"><link rel="prefetch" href="/master/assets/js/191.8db84f5e.js"><link rel="prefetch" href="/master/assets/js/192.10e6303a.js"><link rel="prefetch" href="/master/assets/js/193.fbdff6d5.js"><link rel="prefetch" href="/master/assets/js/194.d473ffb9.js"><link rel="prefetch" href="/master/assets/js/195.943bf237.js"><link rel="prefetch" href="/master/assets/js/196.78f88461.js"><link rel="prefetch" href="/master/assets/js/197.04fb062d.js"><link rel="prefetch" href="/master/assets/js/198.4b7bd369.js"><link rel="prefetch" href="/master/assets/js/199.2fc4251b.js"><link rel="prefetch" href="/master/assets/js/200.e8092982.js"><link rel="prefetch" href="/master/assets/js/201.ad0ca234.js"><link rel="prefetch" href="/master/assets/js/202.ba982f85.js"><link rel="prefetch" href="/master/assets/js/203.58278d59.js"><link rel="prefetch" href="/master/assets/js/204.530c01f4.js"><link rel="prefetch" href="/master/assets/js/205.92a67f57.js"><link rel="prefetch" href="/master/assets/js/206.c5965b0c.js"><link rel="prefetch" href="/master/assets/js/207.6ecd36d8.js"><link rel="prefetch" href="/master/assets/js/208.1fda83e3.js"><link rel="prefetch" href="/master/assets/js/209.97336016.js"><link rel="prefetch" href="/master/assets/js/210.6987519a.js"><link rel="prefetch" href="/master/assets/js/211.a33323ae.js"><link rel="prefetch" href="/master/assets/js/212.c604bd63.js"><link rel="prefetch" href="/master/assets/js/213.5587058c.js"><link rel="prefetch" href="/master/assets/js/214.fa9254c0.js"><link rel="prefetch" href="/master/assets/js/215.f0fce597.js"><link rel="prefetch" href="/master/assets/js/216.d7f22820.js"><link rel="prefetch" href="/master/assets/js/217.758018af.js"><link rel="prefetch" href="/master/assets/js/218.01e70259.js"><link rel="prefetch" href="/master/assets/js/219.b84360b6.js"><link rel="prefetch" href="/master/assets/js/22.f2a7721b.js"><link rel="prefetch" href="/master/assets/js/220.5c0d86a5.js"><link rel="prefetch" href="/master/assets/js/221.cdd41b1d.js"><link rel="prefetch" href="/master/assets/js/222.93860dc0.js"><link rel="prefetch" href="/master/assets/js/223.e657a453.js"><link rel="prefetch" href="/master/assets/js/224.a2b3a252.js"><link rel="prefetch" href="/master/assets/js/225.b6cd6c3c.js"><link rel="prefetch" href="/master/assets/js/226.80cc67c6.js"><link rel="prefetch" href="/master/assets/js/227.c4aa2938.js"><link rel="prefetch" href="/master/assets/js/228.aacbe57c.js"><link rel="prefetch" href="/master/assets/js/229.272ca3bb.js"><link rel="prefetch" href="/master/assets/js/23.3585792b.js"><link rel="prefetch" href="/master/assets/js/230.ac763afc.js"><link rel="prefetch" href="/master/assets/js/231.149f56b4.js"><link rel="prefetch" href="/master/assets/js/232.15826ff6.js"><link rel="prefetch" href="/master/assets/js/233.9fbd25cc.js"><link rel="prefetch" href="/master/assets/js/234.aae0d1d4.js"><link rel="prefetch" href="/master/assets/js/235.8158d914.js"><link rel="prefetch" href="/master/assets/js/236.578d0ba4.js"><link rel="prefetch" href="/master/assets/js/237.576b607d.js"><link rel="prefetch" href="/master/assets/js/238.83492fa9.js"><link rel="prefetch" href="/master/assets/js/239.f3344236.js"><link rel="prefetch" href="/master/assets/js/240.f30a632c.js"><link rel="prefetch" href="/master/assets/js/241.244c1e08.js"><link rel="prefetch" href="/master/assets/js/242.8c617355.js"><link rel="prefetch" href="/master/assets/js/243.cbbbed8a.js"><link rel="prefetch" href="/master/assets/js/244.fe594f7c.js"><link rel="prefetch" href="/master/assets/js/245.bbcf1378.js"><link rel="prefetch" href="/master/assets/js/246.62527ea7.js"><link rel="prefetch" href="/master/assets/js/247.aa90a132.js"><link rel="prefetch" href="/master/assets/js/248.3098aa52.js"><link rel="prefetch" href="/master/assets/js/249.afad9084.js"><link rel="prefetch" href="/master/assets/js/250.b15fdc90.js"><link rel="prefetch" href="/master/assets/js/251.5646fcc2.js"><link rel="prefetch" href="/master/assets/js/252.ecf07444.js"><link rel="prefetch" href="/master/assets/js/253.0bd7f622.js"><link rel="prefetch" href="/master/assets/js/254.d492ac3e.js"><link rel="prefetch" href="/master/assets/js/255.8bd41455.js"><link rel="prefetch" href="/master/assets/js/256.d4462e7d.js"><link rel="prefetch" href="/master/assets/js/257.797cc72d.js"><link rel="prefetch" href="/master/assets/js/258.27f39f23.js"><link rel="prefetch" href="/master/assets/js/259.ad3448ab.js"><link rel="prefetch" href="/master/assets/js/26.922fc32d.js"><link rel="prefetch" href="/master/assets/js/260.0294a586.js"><link rel="prefetch" href="/master/assets/js/261.0eaa0b9f.js"><link rel="prefetch" href="/master/assets/js/262.06819323.js"><link rel="prefetch" href="/master/assets/js/263.05690e0f.js"><link rel="prefetch" href="/master/assets/js/264.8a841edd.js"><link rel="prefetch" href="/master/assets/js/265.7308bbfb.js"><link rel="prefetch" href="/master/assets/js/266.d10b567b.js"><link rel="prefetch" href="/master/assets/js/267.2a830a94.js"><link rel="prefetch" href="/master/assets/js/268.cf9b6e9a.js"><link rel="prefetch" href="/master/assets/js/269.a56e873a.js"><link rel="prefetch" href="/master/assets/js/27.a195c036.js"><link rel="prefetch" href="/master/assets/js/270.ac696056.js"><link rel="prefetch" href="/master/assets/js/271.a56f1c15.js"><link rel="prefetch" href="/master/assets/js/272.23c07599.js"><link rel="prefetch" href="/master/assets/js/273.fbe68aeb.js"><link rel="prefetch" href="/master/assets/js/274.fe2386ad.js"><link rel="prefetch" href="/master/assets/js/275.69282bce.js"><link rel="prefetch" href="/master/assets/js/276.240d659c.js"><link rel="prefetch" href="/master/assets/js/28.384b9a99.js"><link rel="prefetch" href="/master/assets/js/29.e9daa0bc.js"><link rel="prefetch" href="/master/assets/js/3.1cd0e33c.js"><link rel="prefetch" href="/master/assets/js/30.5ab7786b.js"><link rel="prefetch" href="/master/assets/js/31.1e453d18.js"><link rel="prefetch" href="/master/assets/js/32.35268055.js"><link rel="prefetch" href="/master/assets/js/33.30a50a02.js"><link rel="prefetch" href="/master/assets/js/34.9c4a443a.js"><link rel="prefetch" href="/master/assets/js/35.db83baae.js"><link rel="prefetch" href="/master/assets/js/36.da1c5d51.js"><link rel="prefetch" href="/master/assets/js/37.50e455e2.js"><link rel="prefetch" href="/master/assets/js/39.d3b31824.js"><link rel="prefetch" href="/master/assets/js/4.e6373162.js"><link rel="prefetch" href="/master/assets/js/41.88458af2.js"><link rel="prefetch" href="/master/assets/js/42.aef6ffe8.js"><link rel="prefetch" href="/master/assets/js/43.59e6430f.js"><link rel="prefetch" href="/master/assets/js/46.2eee78b0.js"><link rel="prefetch" href="/master/assets/js/47.2d2c9c61.js"><link rel="prefetch" href="/master/assets/js/48.888652e0.js"><link rel="prefetch" href="/master/assets/js/49.7518a020.js"><link rel="prefetch" href="/master/assets/js/50.cb1c2ceb.js"><link rel="prefetch" href="/master/assets/js/51.559ef27c.js"><link rel="prefetch" href="/master/assets/js/52.bb739ede.js"><link rel="prefetch" href="/master/assets/js/53.4603f16f.js"><link rel="prefetch" href="/master/assets/js/54.ca6c6483.js"><link rel="prefetch" href="/master/assets/js/55.3b3a1e0a.js"><link rel="prefetch" href="/master/assets/js/57.53889f56.js"><link rel="prefetch" href="/master/assets/js/58.bc13479f.js"><link rel="prefetch" href="/master/assets/js/59.9025c9ef.js"><link rel="prefetch" href="/master/assets/js/6.f7acf8d3.js"><link rel="prefetch" href="/master/assets/js/60.16551eff.js"><link rel="prefetch" href="/master/assets/js/61.46f5ed80.js"><link rel="prefetch" href="/master/assets/js/63.b20bf942.js"><link rel="prefetch" href="/master/assets/js/67.38659a6f.js"><link rel="prefetch" href="/master/assets/js/68.66aa10ef.js"><link rel="prefetch" href="/master/assets/js/69.2163ef0b.js"><link rel="prefetch" href="/master/assets/js/70.ad5dd2d2.js"><link rel="prefetch" href="/master/assets/js/71.a8b1be45.js"><link rel="prefetch" href="/master/assets/js/72.6e1a24bb.js"><link rel="prefetch" href="/master/assets/js/73.6f5020f1.js"><link rel="prefetch" href="/master/assets/js/74.c3531406.js"><link rel="prefetch" href="/master/assets/js/75.ba272559.js"><link rel="prefetch" href="/master/assets/js/76.54fa3332.js"><link rel="prefetch" href="/master/assets/js/77.20562058.js"><link rel="prefetch" href="/master/assets/js/78.fb2118d8.js"><link rel="prefetch" href="/master/assets/js/79.37c1c8cc.js"><link rel="prefetch" href="/master/assets/js/8.f830f562.js"><link rel="prefetch" href="/master/assets/js/80.abd6c897.js"><link rel="prefetch" href="/master/assets/js/81.28f9ddd9.js"><link rel="prefetch" href="/master/assets/js/82.28920985.js"><link rel="prefetch" href="/master/assets/js/83.6bdc0ed7.js"><link rel="prefetch" href="/master/assets/js/84.67c01fe3.js"><link rel="prefetch" href="/master/assets/js/85.2b3eae25.js"><link rel="prefetch" href="/master/assets/js/86.a7bdae44.js"><link rel="prefetch" href="/master/assets/js/87.b456d7ab.js"><link rel="prefetch" href="/master/assets/js/88.f8ce81fe.js"><link rel="prefetch" href="/master/assets/js/89.f80c82a5.js"><link rel="prefetch" href="/master/assets/js/9.98e56c96.js"><link rel="prefetch" href="/master/assets/js/90.100c678c.js"><link rel="prefetch" href="/master/assets/js/91.9e0eb885.js"><link rel="prefetch" href="/master/assets/js/92.068d4a86.js"><link rel="prefetch" href="/master/assets/js/93.7fbc83f0.js"><link rel="prefetch" href="/master/assets/js/94.182ccb66.js"><link rel="prefetch" href="/master/assets/js/95.c1e6c57d.js"><link rel="prefetch" href="/master/assets/js/96.40381e38.js"><link rel="prefetch" href="/master/assets/js/97.7aaeced9.js"><link rel="prefetch" href="/master/assets/js/98.dae4dd3e.js"><link rel="prefetch" href="/master/assets/js/99.91817ca7.js">
<link rel="stylesheet" href="/master/assets/css/0.styles.3ed5e0a6.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div data-v-58560e81><div data-v-40401285 data-v-58560e81><div class="banner-wrapper" data-v-40401285 data-v-40401285><div class="wrapper" data-v-40401285><div class="message" data-v-40401285>By using this website, you agree to our <a href="https://www.cookiesandyou.com" target="_blank" rel="noopener" style="color:#505FFF;" data-v-40401285>Cookie Policy</a>.</div> <div class="box" data-v-40401285><span class="icon-cross" data-v-40401285><svg width="16" height="16" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-40401285><path d="M1.66669 1.66669L12.3334 12.3334M12.3334 1.66669L1.66664 12.3334" stroke="#A2A3AD" stroke-width="1.5" stroke-linecap="round" data-v-40401285></path></svg></span></div></div></div></div><!----><div class="layout" data-v-58560e81><div class="layout__sidebar" data-v-58560e81><div style="height:100%;position:relative;" data-v-25cba946 data-v-58560e81><div class="container" data-v-25cba946><a href="/master/" class="logo__container router-link-active" data-v-25cba946><div class="logo" data-v-25cba946><div class="logo__img" data-v-25cba946><svg width="100%" height="100%" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-25cba946><path fill-rule="evenodd" clip-rule="evenodd" d="M100 6.9282L19.3975 53.4641V146.536L100 193.072L180.603 146.536V53.4641L100 6.9282ZM186.603 50L100 0L13.3975 50V150L100 200L186.603 150V50Z" fill="#00BB00"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M118.521 80.989C112.693 78.6912 106.416 77.4911 100.076 77.4911C86.7528 77.4911 74.2205 82.7219 64.7884 92.2196C55.3971 101.676 50.1795 114.236 50.0956 127.588L50.0845 129.381L51.6424 130.267C59.151 134.539 67.6423 136.787 76.2468 136.787C76.4834 136.787 76.7219 136.785 76.9591 136.782C84.4596 136.674 91.8801 134.87 98.6072 131.541C96.486 130.355 94.4533 129.019 92.5209 127.546C80.7952 132.165 67.5061 131.595 56.2598 125.81C57.3537 102.38 76.6441 83.6116 100.076 83.6116C106.594 83.6116 113.031 85.0533 118.845 87.7928C118.92 85.5246 118.812 83.2511 118.521 80.989Z" fill="#00BB00"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M150.057 127.172C149.879 110.572 141.795 95.4272 128.321 86.2016C128.331 88.6306 128.169 91.0582 127.835 93.4714C137.41 101.289 143.247 112.801 143.885 125.413C123.232 136.055 97.4756 128.602 85.743 108.266C82.574 102.772 80.6311 96.6307 80.0601 90.3552C78.0668 91.4421 76.163 92.6927 74.3657 94.0948C75.3134 100.134 77.3729 105.999 80.4462 111.326C87.1202 122.894 97.85 131.188 110.658 134.678C115.004 135.863 119.422 136.449 123.816 136.449C132.377 136.449 140.847 134.224 148.51 129.866L150.076 128.975L150.057 127.172Z" fill="#00BB00"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M101.843 42.9061L100.298 42L98.7531 42.9047C91.1194 47.3722 84.7773 53.7773 80.4121 61.4272C76.6426 68.0338 74.413 75.4344 73.8901 82.9885C75.9799 81.7463 78.1569 80.6541 80.4079 79.7207C82.347 67.2679 89.5887 56.0133 100.295 49.1357C119.96 61.7797 126.427 87.9954 114.615 108.469C111.416 114.013 107.043 118.807 101.861 122.488C103.796 123.668 105.829 124.693 107.94 125.549C112.731 121.666 116.809 116.908 119.912 111.529C133.703 87.6254 125.597 56.8415 101.843 42.9061Z" fill="#00BB00"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M100.268 95.1374C97.4504 95.1374 95.1588 97.431 95.1588 100.25C95.1588 103.069 97.4504 105.363 100.268 105.363C103.085 105.363 105.377 103.069 105.377 100.25C105.377 97.431 103.085 95.1374 100.268 95.1374ZM100.268 111.483C94.0779 111.483 89.0427 106.444 89.0427 100.25C89.0427 94.056 94.0779 89.0169 100.268 89.0169C106.457 89.0169 111.493 94.056 111.493 100.25C111.493 106.444 106.457 111.483 100.268 111.483Z" fill="#00BB00"></path></svg></div><div class="logo__text" data-v-25cba946>Tendermint Core</div></div></a><div class="items footer__compact__false" data-v-25cba946><div class="sidebar" style="display:block;" data-v-25cba946><div class="title" data-v-25cba946></div><!----></div><div class="sidebar" style="display:block;" data-v-25cba946><div class="title" data-v-25cba946>Resources</div><!----></div><div class="sidebar version" data-v-25cba946><div data-v-08503e1b data-v-25cba946><div class="container" data-v-08503e1b><span class="sr-only" data-v-08503e1b>Docs Version Switcher</span><div class="select" data-v-08503e1b><select data-v-08503e1b><option value="" disabled="disabled" data-v-08503e1b>Version</option><option value="v0.33" data-v-08503e1b>v0.33</option><option value="v0.34" data-v-08503e1b>v0.34</option><option value="v0.35" data-v-08503e1b>v0.35</option></select></div></div></div></div></div><div class="footer footer__compact__false" data-v-25cba946><a href="https://docs.cosmos.network/" target="_blank" rel="noreferrer noopener" class="footer__item" style="--color:#5064FB;" data-v-25cba946><div class="footer__item__icon" data-v-25cba946><svg width="100%" height="100%" viewBox="0 0 29 33" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M14.5249 1.86771L1.62846 9.31346V24.2049L14.5249 31.6507L27.4213 24.2049V9.31346L14.5249 1.86771ZM28.3813 8.7592L14.5249 0.759201L0.668463 8.7592V24.7592L14.5249 32.7592L28.3813 24.7592V8.7592Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.5249 14.6144L12.7136 15.6602V17.7516L14.5249 18.7974L16.3362 17.7516V15.6602L14.5249 14.6144ZM17.2962 15.1059L14.5249 13.5059L11.7536 15.1059V18.3059L14.5249 19.9059L17.2962 18.3059V15.1059Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M17.6182 20.0011L15.8069 21.0468V23.1383L17.6182 24.1841L19.4295 23.1383V21.0468L17.6182 20.0011ZM20.3895 20.4926L17.6182 18.8926L14.8469 20.4926V23.6926L17.6182 25.2926L20.3895 23.6926V20.4926Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M20.7115 14.6144L18.9003 15.6602V17.7516L20.7115 18.7974L22.5228 17.7516V15.6602L20.7115 14.6144ZM23.4828 15.1059L20.7115 13.5059L17.9403 15.1059V18.3059L20.7115 19.9059L23.4828 18.3059V15.1059Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M8.33821 14.6144L6.52693 15.6602V17.7516L8.33821 18.7974L10.1495 17.7516V15.6602L8.33821 14.6144ZM11.1095 15.1059L8.33821 13.5059L5.56693 15.1059V18.3059L8.33821 19.9059L11.1095 18.3059V15.1059Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M11.4315 20.0011L9.62026 21.0468V23.1383L11.4315 24.1841L13.2428 23.1383V21.0468L11.4315 20.0011ZM14.2028 20.4926L11.4315 18.8926L8.66026 20.4926V23.6926L11.4315 25.2926L14.2028 23.6926V20.4926Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M17.6182 9.33442L15.8069 10.3802V12.4716L17.6182 13.5174L19.4295 12.4716V10.3802L17.6182 9.33442ZM20.3895 9.82591L17.6182 8.22591L14.8469 9.82591V13.0259L17.6182 14.6259L20.3895 13.0259V9.82591Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M11.4315 9.33442L9.62026 10.3802V12.4716L11.4315 13.5174L13.2428 12.4716V10.3802L11.4315 9.33442ZM14.2028 9.82591L11.4315 8.22591L8.66026 9.82591V13.0259L11.4315 14.6259L14.2028 13.0259V9.82591Z"></path></svg></div><div class="footer__item__title" data-v-25cba946><div>Cosmos<br>SDK</div></div></a><a href="https://hub.cosmos.network/" target="_blank" rel="noreferrer noopener" class="footer__item" style="--color:#BA3FD9;" data-v-25cba946><div class="footer__item__icon" data-v-25cba946><svg width="100%" height="100%" viewBox="0 0 29 33" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M14.7074 1.86771L1.81101 9.31346V24.2049L14.7074 31.6507L27.6038 24.2049V9.31346L14.7074 1.86771ZM28.5638 8.7592L14.7074 0.759201L0.851009 8.7592V24.7592L14.7074 32.7592L28.5638 24.7592V8.7592Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.702 11.0209C13.7115 11.0209 12.9058 10.2146 12.9058 9.22341C12.9058 8.23228 13.7115 7.42595 14.702 7.42595C15.6924 7.42595 16.4982 8.23228 16.4982 9.22341C16.4982 10.2146 15.6924 11.0209 14.702 11.0209ZM14.702 8.40532C14.2512 8.40532 13.8845 8.77232 13.8845 9.22341C13.8845 9.6745 14.2512 10.0415 14.702 10.0415C15.1528 10.0415 15.5195 9.6745 15.5195 9.22341C15.5195 8.77232 15.1528 8.40532 14.702 8.40532Z"></path> <path d="M14.2392 11.3182C14.3935 11.3538 14.5541 11.3726 14.7191 11.3726C14.8841 11.3726 15.0448 11.3538 15.1992 11.3182V14.6804C15.0448 14.6448 14.8841 14.626 14.7191 14.626C14.5541 14.626 14.3935 14.6448 14.2392 14.6804V11.3182Z"></path> <path d="M13.1599 15.3048L10.247 13.623C10.2007 13.7745 10.1366 13.9231 10.0541 14.066C9.97165 14.2089 9.87502 14.3386 9.76702 14.4544L12.6788 16.1355C12.7749 15.8219 12.9414 15.5388 13.1599 15.3048Z"></path> <path d="M12.6788 17.383L9.767 19.0642C9.87503 19.18 9.97168 19.3098 10.0542 19.4527C10.1367 19.5955 10.2007 19.7441 10.247 19.8955L13.1598 18.2138C12.9414 17.9798 12.7749 17.6967 12.6788 17.383Z"></path> <path d="M14.2392 18.8382V22.2004C14.3935 22.1648 14.5542 22.146 14.7192 22.146C14.8842 22.146 15.0448 22.1648 15.1992 22.2004V18.8382C15.0448 18.8738 14.8841 18.8926 14.7191 18.8926C14.5541 18.8926 14.3935 18.8738 14.2392 18.8382Z"></path> <path d="M16.2784 18.2138L19.1913 19.8955C19.2376 19.7441 19.3017 19.5955 19.3842 19.4526C19.4667 19.3097 19.5633 19.18 19.6713 19.0641L16.7595 17.383C16.6634 17.6966 16.4969 17.9797 16.2784 18.2138Z"></path> <path d="M16.7595 16.1356L19.6713 14.4544C19.5633 14.3386 19.4666 14.2088 19.3841 14.0659C19.3016 13.923 19.2376 13.7745 19.1913 13.623L16.2784 15.3048C16.4969 15.5388 16.6634 15.8219 16.7595 16.1356Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M9.74094 13.905C9.24572 14.7627 8.1446 15.0573 7.28623 14.5617C6.42789 14.0662 6.13243 12.9653 6.62765 12.1075C7.12287 11.2498 8.22408 10.9551 9.08241 11.4506C9.94079 11.9462 10.2362 13.0472 9.74094 13.905ZM7.47581 12.5972C7.25041 12.9876 7.3849 13.4887 7.77555 13.7142C8.16621 13.9397 8.66738 13.8057 8.89278 13.4153C9.11818 13.0249 8.98374 12.5237 8.59309 12.2982C8.20243 12.0726 7.70122 12.2068 7.47581 12.5972Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M9.75813 19.6434C10.2534 20.5011 9.95794 21.602 9.09956 22.0976C8.24122 22.5932 7.14006 22.2986 6.64484 21.4408C6.14962 20.5831 6.44503 19.4821 7.30337 18.9865C8.16175 18.4909 9.26291 18.7856 9.75813 19.6434ZM7.493 20.9512C7.71841 21.3416 8.21958 21.4756 8.61023 21.2501C9.00089 21.0245 9.13537 20.5235 8.90997 20.1331C8.68457 19.7427 8.18336 19.6085 7.7927 19.8341C7.40204 20.0596 7.2676 20.5607 7.493 20.9512Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.7363 22.4977C15.7268 22.4977 16.5325 23.304 16.5325 24.2952C16.5325 25.2863 15.7268 26.0926 14.7363 26.0926C13.7459 26.0926 12.9401 25.2863 12.9401 24.2952C12.9401 23.304 13.7459 22.4977 14.7363 22.4977ZM14.7363 25.1133C15.1871 25.1133 15.5538 24.7463 15.5538 24.2952C15.5538 23.8441 15.1871 23.4771 14.7363 23.4771C14.2855 23.4771 13.9188 23.8441 13.9188 24.2952C13.9188 24.7463 14.2855 25.1133 14.7363 25.1133Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M19.6974 19.6136C20.1926 18.7559 21.2937 18.4613 22.1521 18.9568C23.0104 19.4524 23.3059 20.5533 22.8107 21.4111C22.3154 22.2688 21.2142 22.5635 20.3559 22.0679C19.4975 21.5723 19.2021 20.4714 19.6974 19.6136ZM21.9625 20.9214C22.1879 20.531 22.0534 20.0299 21.6628 19.8044C21.2721 19.5788 20.7709 19.7129 20.5455 20.1033C20.3201 20.4937 20.4546 20.9948 20.8452 21.2204C21.2359 21.4459 21.7371 21.3118 21.9625 20.9214Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M19.6802 13.8752C19.185 13.0174 19.4804 11.9165 20.3387 11.421C21.1971 10.9254 22.2982 11.22 22.7935 12.0777C23.2887 12.9355 22.9933 14.0365 22.1349 14.532C21.2766 15.0276 20.1754 14.7329 19.6802 13.8752ZM21.9453 12.5674C21.7199 12.177 21.2187 12.043 20.8281 12.2685C20.4374 12.494 20.3029 12.9951 20.5283 13.3855C20.7537 13.7759 21.2549 13.9101 21.6456 13.6845C22.0363 13.459 22.1707 12.9578 21.9453 12.5674Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.702 15.9253C14.2512 15.9253 13.8845 16.2923 13.8845 16.7434C13.8845 17.1945 14.2512 17.5615 14.702 17.5615C15.1528 17.5615 15.5195 17.1945 15.5195 16.7434C15.5195 16.2923 15.1528 15.9253 14.702 15.9253ZM14.702 18.5409C13.7115 18.5409 12.9058 17.7346 12.9058 16.7434C12.9058 15.7523 13.7115 14.946 14.702 14.946C15.6924 14.946 16.4982 15.7523 16.4982 16.7434C16.4982 17.7346 15.6924 18.5409 14.702 18.5409Z"></path></svg></div><div class="footer__item__title" data-v-25cba946><div>Cosmos<br>Hub</div></div></a><a href="https://ibc.cosmos.network" target="_blank" rel="noreferrer noopener" class="footer__item" style="--color:#E6900A;" data-v-25cba946><div class="footer__item__icon" data-v-25cba946><svg width="100%" height="100%" viewBox="0 0 28 33" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M14 1.53446L1.10359 8.98021V23.8717L14 31.3174L26.8964 23.8717V8.98021L14 1.53446ZM27.8564 8.42595L14 0.425949L0.143593 8.42595V24.4259L14 32.4259L27.8564 24.4259V8.42595Z"></path> <path d="M13.4305 11.2288C13.1139 11.141 12.8267 10.9819 12.5873 10.7699L8.35975 18.4481C8.67187 18.5487 8.95282 18.7194 9.18397 18.9416L13.4305 11.2288Z"></path> <path d="M9.79716 20.0526C9.82527 20.1905 9.84002 20.3332 9.84002 20.4792C9.84002 20.6633 9.81659 20.8421 9.77254 21.0126H18.2808C18.2368 20.8421 18.2134 20.6633 18.2134 20.4792C18.2134 20.3332 18.2281 20.1905 18.2562 20.0526L9.79716 20.0526Z"></path> <path d="M15.4184 10.7648L19.6862 18.4505C19.3745 18.5522 19.0942 18.7239 18.8638 18.9469L14.5768 11.2267C14.893 11.1378 15.1797 10.9777 15.4184 10.7648Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M20.3295 19.6453C19.8787 19.6453 19.512 20.0123 19.512 20.4634C19.512 20.9145 19.8787 21.2815 20.3295 21.2815C20.7803 21.2815 21.1471 20.9145 21.1471 20.4634C21.1471 20.0123 20.7803 19.6453 20.3295 19.6453ZM20.3295 22.2608C19.3391 22.2608 18.5334 21.4545 18.5334 20.4634C18.5334 19.4722 19.3391 18.6659 20.3295 18.6659C21.3199 18.6659 22.1257 19.4722 22.1257 20.4634C22.1257 21.4545 21.3199 22.2608 20.3295 22.2608Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M13.9828 8.33862C13.532 8.33862 13.1653 8.70561 13.1653 9.1567C13.1653 9.60779 13.532 9.97479 13.9828 9.97479C14.4336 9.97479 14.8004 9.60779 14.8004 9.1567C14.8004 8.70561 14.4336 8.33862 13.9828 8.33862ZM13.9828 10.9542C12.9924 10.9542 12.1867 10.1479 12.1867 9.1567C12.1867 8.16558 12.9924 7.35925 13.9828 7.35925C14.9733 7.35925 15.7791 8.16558 15.7791 9.1567C15.7791 10.1479 14.9733 10.9542 13.9828 10.9542Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M7.6895 19.6453C7.2387 19.6453 6.87201 20.0123 6.87201 20.4634C6.87201 20.9145 7.2387 21.2815 7.6895 21.2815C8.1403 21.2815 8.50708 20.9145 8.50708 20.4634C8.50708 20.0123 8.1403 19.6453 7.6895 19.6453ZM7.6895 22.2608C6.69906 22.2608 5.89336 21.4545 5.89336 20.4634C5.89336 19.4722 6.69906 18.6659 7.6895 18.6659C8.67994 18.6659 9.48573 19.4722 9.48573 20.4634C9.48573 21.4545 8.67994 22.2608 7.6895 22.2608Z"></path></svg></div><div class="footer__item__title" data-v-25cba946><div>IBC<br>Go</div></div></a><!----></div></div></div></div><div class="layout__main" data-v-58560e81><div class="layout__main__navbar" data-v-58560e81><div data-v-19189c02 data-v-58560e81><div class="container" data-v-19189c02><div class="menu" data-v-19189c02><div class="menu__icon" data-v-19189c02><svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#888" data-v-19189c02><path d="M2 5H22M2 12H22M2 19H22" stroke-width="1.5" stroke-linecap="round"></path></svg></div></div><div class="logo" data-v-19189c02><div class="logo__wrapper router-link-active" data-v-19189c02><div class="logo__image" data-v-19189c02><div data-v-19189c02><svg width="100%" height="100%" viewBox="0 0 29 33" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M14.3333 1.20113L1.43693 8.64688V23.5383L14.3333 30.9841L27.2297 23.5383V8.64688L14.3333 1.20113ZM28.1897 8.09262L14.3333 0.0926208L0.476929 8.09262V24.0926L14.3333 32.0926L28.1897 24.0926V8.09262Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M17.2967 13.0508C16.3642 12.6832 15.3599 12.4911 14.3456 12.4911C12.2139 12.4911 10.2087 13.3281 8.6995 14.8477C7.19695 16.3607 6.36214 18.3704 6.3487 20.5067L6.34692 20.7935L6.59619 20.9353C7.79757 21.6189 9.1562 21.9785 10.5329 21.9785C10.5708 21.9785 10.6089 21.9782 10.6469 21.9776C11.8469 21.9604 13.0342 21.6718 14.1106 21.1392C13.7712 20.9493 13.4459 20.7355 13.1367 20.4998C11.2606 21.2389 9.1344 21.1478 7.33497 20.2221C7.51 16.4733 10.5965 13.4704 14.3456 13.4704C15.3884 13.4704 16.4184 13.7011 17.3486 14.1394C17.3606 13.7765 17.3434 13.4127 17.2967 13.0508Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M22.3425 20.4401C22.314 17.7841 21.0207 15.3609 18.8648 13.8848C18.8664 14.2735 18.8404 14.6619 18.787 15.048C20.3189 16.2988 21.2529 18.1407 21.355 20.1586C18.0506 21.8613 13.9295 20.6688 12.0523 17.4151C11.5453 16.5362 11.2344 15.5535 11.143 14.5494C10.8241 14.7233 10.5195 14.9234 10.2319 15.1477C10.3836 16.114 10.7131 17.0524 11.2048 17.9047C12.2726 19.7556 13.9894 21.0826 16.0387 21.6411C16.734 21.8306 17.4409 21.9244 18.1439 21.9244C19.5137 21.9244 20.8689 21.5684 22.095 20.8711L22.3456 20.7285L22.3425 20.4401Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.6283 6.95757L14.3811 6.81259L14.1339 6.95735C12.9125 7.67214 11.8978 8.69696 11.1993 9.92094C10.5962 10.978 10.2395 12.1621 10.1558 13.3707C10.4902 13.172 10.8385 12.9972 11.1987 12.8479C11.5089 10.8554 12.6676 9.05472 14.3807 7.95431C17.527 9.97734 18.5617 14.1718 16.6718 17.4476C16.16 18.3347 15.4602 19.1017 14.6311 19.6906C14.9408 19.8794 15.266 20.0434 15.6038 20.1805C16.3703 19.5591 17.0228 18.7979 17.5193 17.9372C19.7259 14.1126 18.4289 9.18723 14.6283 6.95757Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.3762 15.3146C13.9255 15.3146 13.5588 15.6815 13.5588 16.1326C13.5588 16.5836 13.9255 16.9506 14.3762 16.9506C14.827 16.9506 15.1937 16.5836 15.1937 16.1326C15.1937 15.6815 14.827 15.3146 14.3762 15.3146ZM14.3762 17.9299C13.3859 17.9299 12.5802 17.1237 12.5802 16.1326C12.5802 15.1415 13.3859 14.3353 14.3762 14.3353C15.3666 14.3353 16.1723 15.1415 16.1723 16.1326C16.1723 17.1237 15.3666 17.9299 14.3762 17.9299Z"></path></svg></div></div><div class="logo__text" data-v-19189c02>Tendermint Core</div></div></div><div class="toolbar" data-v-19189c02><div class="toolbar__item" data-v-19189c02><div class="toolbar__item__icon" data-v-19189c02><svg width="100%" height="100%" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#888" data-v-19189c02><path fill-rule="evenodd" clip-rule="evenodd" d="M11.5 2.75C6.66751 2.75 2.75 6.66751 2.75 11.5C2.75 16.3325 6.66751 20.25 11.5 20.25C13.6462 20.25 15.612 19.4773 17.1342 18.1949L22.6697 23.7303C22.9626 24.0232 23.4374 24.0232 23.7303 23.7303C24.0232 23.4374 24.0232 22.9626 23.7303 22.6697L18.1949 17.1342C19.4773 15.612 20.25 13.6462 20.25 11.5C20.25 6.66751 16.3325 2.75 11.5 2.75ZM16.6923 16.5599C17.9656 15.2535 18.75 13.4684 18.75 11.5C18.75 7.49594 15.5041 4.25 11.5 4.25C7.49594 4.25 4.25 7.49594 4.25 11.5C4.25 15.5041 7.49594 18.75 11.5 18.75C13.4684 18.75 15.2535 17.9656 16.5599 16.6923C16.5789 16.6679 16.5996 16.6444 16.622 16.622C16.6444 16.5996 16.6679 16.5789 16.6923 16.5599Z"></path></svg></div></div></div></div></div></div><div class="layout__main__content aside__true" data-v-58560e81><div id="content-scroll" class="layout__main__content__body" data-v-58560e81><div class="layout__main__content__body__breadcrumbs" data-v-58560e81><div data-v-48fb2d7a data-v-58560e81><div class="container" data-v-48fb2d7a><div class="crumbs" data-v-48fb2d7a><a href="/master/" class="crumbs__item router-link-active" data-v-48fb2d7a>Tendermint Core</a><a href="/master/spec/" class="crumbs__item router-link-active" data-v-48fb2d7a>Tendermint Specifications</a><a href="/master/spec/abci/" class="crumbs__item router-link-active" data-v-48fb2d7a>ABCI</a><a href="/master/spec/abci/apps.html" aria-current="page" class="crumbs__item router-link-exact-active router-link-active" data-v-48fb2d7a>Applications</a></div><div class="menu" data-v-48fb2d7a><div class="menu__item" style="visibility:visible;" data-v-48fb2d7a><svg width="100%" height="100%" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="menu__item__icon menu__item__icon__active__false" data-v-48fb2d7a><path fill-rule="evenodd" clip-rule="evenodd" d="M0.25 2C0.25 1.58579 0.585786 1.25 1 1.25H6C6.41421 1.25 6.75 1.58579 6.75 2C6.75 2.41421 6.41421 2.75 6 2.75H1C0.585786 2.75 0.25 2.41421 0.25 2ZM17.53 22.7803L16.9997 22.25L17.53 22.7803L17.5301 22.7802L17.5305 22.7798L17.5322 22.7781L17.5388 22.7715L17.5647 22.7456L17.6647 22.6456L18.0367 22.2737L19.2978 21.0126L22.53 17.7803C22.8229 17.4874 22.8229 17.0126 22.53 16.7197C22.2371 16.4268 21.7622 16.4268 21.4693 16.7197L18.2371 19.9519L17.7497 20.4393V8.5C17.7497 6.34186 17.0721 4.51182 15.7802 3.21983C14.4882 1.92783 12.6581 1.25031 10.5 1.25031C10.0858 1.25031 9.75 1.5861 9.75 2.00031C9.75 2.41453 10.0858 2.75031 10.5 2.75031C12.3419 2.75031 13.7617 3.32264 14.7195 4.28049C15.6773 5.23834 16.2497 6.65814 16.2497 8.5L16.2497 20.4393L12.53 16.7197C12.2371 16.4268 11.7622 16.4268 11.4693 16.7197C11.1764 17.0126 11.1764 17.4874 11.4693 17.7803L16.4693 22.7803L16.9997 23.3107L17.53 22.7803ZM1 6.25C0.585786 6.25 0.25 6.58579 0.25 7C0.25 7.41421 0.585786 7.75 1 7.75H10C10.4142 7.75 10.75 7.41421 10.75 7C10.75 6.58579 10.4142 6.25 10 6.25H1ZM0.25 12C0.25 11.5858 0.585786 11.25 1 11.25H12C12.4142 11.25 12.75 11.5858 12.75 12C12.75 12.4142 12.4142 12.75 12 12.75H1C0.585786 12.75 0.25 12.4142 0.25 12ZM1 16.25C0.585786 16.25 0.25 16.5858 0.25 17C0.25 17.4142 0.585786 17.75 1 17.75H8C8.41421 17.75 8.75 17.4142 8.75 17C8.75 16.5858 8.41421 16.25 8 16.25H1Z" data-v-48fb2d7a></path></svg><!----></div></div></div></div></div><div class="layout__main__content__body__wrapper" data-v-58560e81><div style="width:100%;" data-v-c85ed208 data-v-58560e81><div class="search__container" data-v-c85ed208><div class="search" data-v-c85ed208><div class="search__icon" data-v-c85ed208><svg width="100%" height="100%" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" data-v-c85ed208><path fill-rule="evenodd" clip-rule="evenodd" d="M11.5 2.75C6.66751 2.75 2.75 6.66751 2.75 11.5C2.75 16.3325 6.66751 20.25 11.5 20.25C13.6462 20.25 15.612 19.4773 17.1342 18.1949L22.6697 23.7303C22.9626 24.0232 23.4374 24.0232 23.7303 23.7303C24.0232 23.4374 24.0232 22.9626 23.7303 22.6697L18.1949 17.1342C19.4773 15.612 20.25 13.6462 20.25 11.5C20.25 6.66751 16.3325 2.75 11.5 2.75ZM16.6923 16.5599C17.9656 15.2535 18.75 13.4684 18.75 11.5C18.75 7.49594 15.5041 4.25 11.5 4.25C7.49594 4.25 4.25 7.49594 4.25 11.5C4.25 15.5041 7.49594 18.75 11.5 18.75C13.4684 18.75 15.2535 17.9656 16.5599 16.6923C16.5789 16.6679 16.5996 16.6444 16.622 16.622C16.6444 16.5996 16.6679 16.5789 16.6923 16.5599Z"></path></svg></div><div class="search__text" data-v-c85ed208>Search</div></div></div><div class="container" data-v-c85ed208><div class="content__default" data-v-58560e81><h1 id="applications"><a href="#applications" class="header-anchor">#</a> Applications</h1> <p>Please ensure you've first read the spec for <a href="/master/spec/abci/abci.html">ABCI Methods and Types</a></p> <p>Here we cover the following components of ABCI applications:</p> <ul><li><a href="#connection-state">Connection State</a> - the interplay between ABCI connections and application state
and the differences between <code>CheckTx</code> and <code>DeliverTx</code>.</li> <li><a href="#transaction-results">Transaction Results</a> - rules around transaction
results and validity</li> <li><a href="#updating-the-validator-set">Validator Set Updates</a> - how validator sets are
changed during <code>InitChain</code> and <code>EndBlock</code></li> <li><a href="#query">Query</a> - standards for using the <code>Query</code> method and proofs about the
application state</li> <li><a href="#crash-recovery">Crash Recovery</a> - handshake protocol to synchronize
Tendermint and the application on startup.</li> <li><a href="#state-sync">State Sync</a> - rapid bootstrapping of new nodes by restoring state machine snapshots</li></ul> <h2 id="connection-state"><a href="#connection-state" class="header-anchor">#</a> Connection State</h2> <p>Since Tendermint maintains four concurrent ABCI connections, it is typical
for an application to maintain a distinct state for each, and for the states to
be synchronized during <code>Commit</code>.</p> <h3 id="concurrency"><a href="#concurrency" class="header-anchor">#</a> Concurrency</h3> <p>In principle, each of the four ABCI connections operate concurrently with one
another. This means applications need to ensure access to state is
thread safe. In practice, both the
<a href="https://github.com/tendermint/tendermint/blob/v0.34.4/abci/client/local_client.go#L18" target="_blank" rel="noopener noreferrer">default in-process ABCI client<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>
and the
<a href="https://github.com/tendermint/tendermint/blob/v0.34.4/abci/server/socket_server.go#L32" target="_blank" rel="noopener noreferrer">default Go ABCI
server<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>
use global locks across all connections, so they are not
concurrent at all. This means if your app is written in Go, and compiled in-process with Tendermint
using the default <code>NewLocalClient</code>, or run out-of-process using the default <code>SocketServer</code>,
ABCI messages from all connections will be linearizable (received one at a
time).</p> <p>The existence of this global mutex means Go application developers can get
thread safety for application state by routing <em>all</em> reads and writes through the ABCI
system. Thus it may be <em>unsafe</em> to expose application state directly to an RPC
interface, and unless explicit measures are taken, all queries should be routed through the ABCI Query method.</p> <h3 id="beginblock"><a href="#beginblock" class="header-anchor">#</a> BeginBlock</h3> <p>The BeginBlock request can be used to run some code at the beginning of
every block. It also allows Tendermint to send the current block hash
and header to the application, before it sends any of the transactions.</p> <p>The app should remember the latest height and header (ie. from which it
has run a successful Commit) so that it can tell Tendermint where to
pick up from when it restarts. See information on the Handshake, below.</p> <h3 id="commit"><a href="#commit" class="header-anchor">#</a> Commit</h3> <p>Application state should only be persisted to disk during <code>Commit</code>.</p> <p>Before <code>Commit</code> is called, Tendermint locks and flushes the mempool so that no new messages will
be received on the mempool connection. This provides an opportunity to safely update all four connection
states to the latest committed state at once.</p> <p>When <code>Commit</code> completes, it unlocks the mempool.</p> <p>WARNING: if the ABCI app logic processing the <code>Commit</code> message sends a
<code>/broadcast_tx_sync</code> or <code>/broadcast_tx_commit</code> and waits for the response
before proceeding, it will deadlock. Executing those <code>broadcast_tx</code> calls
involves acquiring a lock that is held during the <code>Commit</code> call, so it's not
possible. If you make the call to the <code>broadcast_tx</code> endpoints concurrently,
that's no problem, it just can't be part of the sequential logic of the
<code>Commit</code> function.</p> <h3 id="consensus-connection"><a href="#consensus-connection" class="header-anchor">#</a> Consensus Connection</h3> <p>The Consensus Connection should maintain a <code>DeliverTxState</code> - the working state
for block execution. It should be updated by the calls to <code>BeginBlock</code>, <code>DeliverTx</code>,
and <code>EndBlock</code> during block execution and committed to disk as the &quot;latest
committed state&quot; during <code>Commit</code>.</p> <p>Updates made to the <code>DeliverTxState</code> by each method call must be readable by each subsequent method -
ie. the updates are linearizable.</p> <h3 id="mempool-connection"><a href="#mempool-connection" class="header-anchor">#</a> Mempool Connection</h3> <p>The mempool Connection should maintain a <code>CheckTxState</code>
to sequentially process pending transactions in the mempool that have
not yet been committed. It should be initialized to the latest committed state
at the end of every <code>Commit</code>.</p> <p>Before calling <code>Commit</code>, Tendermint will lock and flush the mempool connection,
ensuring that all existing CheckTx are responded to and no new ones can begin.
The <code>CheckTxState</code> may be updated concurrently with the <code>DeliverTxState</code>, as
messages may be sent concurrently on the Consensus and Mempool connections.</p> <p>After <code>Commit</code>, while still holding the mempool lock, CheckTx is run again on all transactions that remain in the
node's local mempool after filtering those included in the block.
An additional <code>Type</code> parameter is made available to the CheckTx function that
indicates whether an incoming transaction is new (<code>CheckTxType_New</code>), or a
recheck (<code>CheckTxType_Recheck</code>).</p> <p>Finally, after re-checking transactions in the mempool, Tendermint will unlock
the mempool connection. New transactions are once again able to be processed through CheckTx.</p> <p>Note that CheckTx is just a weak filter to keep invalid transactions out of the block chain.
CheckTx doesn't have to check everything that affects transaction validity; the
expensive things can be skipped. It's weak because a Byzantine node doesn't
care about CheckTx; it can propose a block full of invalid transactions if it wants.</p> <h4 id="replay-protection"><a href="#replay-protection" class="header-anchor">#</a> Replay Protection</h4> <p>To prevent old transactions from being replayed, CheckTx must implement
replay protection.</p> <p>It is possible for old transactions to be sent to the application. So
it is important CheckTx implements some logic to handle them.</p> <h3 id="query-connection"><a href="#query-connection" class="header-anchor">#</a> Query Connection</h3> <p>The Info Connection should maintain a <code>QueryState</code> for answering queries from the user,
and for initialization when Tendermint first starts up (both described further
below).
It should always contain the latest committed state associated with the
latest committed block.</p> <p><code>QueryState</code> should be set to the latest <code>DeliverTxState</code> at the end of every <code>Commit</code>,
after the full block has been processed and the state committed to disk.
Otherwise it should never be modified.</p> <p>Tendermint Core currently uses the Query connection to filter peers upon
connecting, according to IP address or node ID. For instance,
returning non-OK ABCI response to either of the following queries will
cause Tendermint to not connect to the corresponding peer:</p> <ul><li><code>p2p/filter/addr/&lt;ip addr&gt;</code>, where <code>&lt;ip addr&gt;</code> is an IP address.</li> <li><code>p2p/filter/id/&lt;id&gt;</code>, where <code>&lt;is&gt;</code> is the hex-encoded node ID (the hash of
the node's p2p pubkey).</li></ul> <p>Note: these query formats are subject to change!</p> <h3 id="snapshot-connection"><a href="#snapshot-connection" class="header-anchor">#</a> Snapshot Connection</h3> <p>The Snapshot Connection is optional, and is only used to serve state sync snapshots for other nodes
and/or restore state sync snapshots to a local node being bootstrapped.</p> <p>For more information, see <a href="#state-sync">the state sync section of this document</a>.</p> <h2 id="transaction-results"><a href="#transaction-results" class="header-anchor">#</a> Transaction Results</h2> <p>The <code>Info</code> and <code>Log</code> fields are non-deterministic values for debugging/convenience purposes
that are otherwise ignored.</p> <p>The <code>Data</code> field must be strictly deterministic, but can be arbitrary data.</p> <h3 id="gas"><a href="#gas" class="header-anchor">#</a> Gas</h3> <p>Ethereum introduced the notion of <code>gas</code> as an abstract representation of the
cost of resources used by nodes when processing transactions. Every operation in the
Ethereum Virtual Machine uses some amount of gas, and gas can be accepted at a market-variable price.
Users propose a maximum amount of gas for their transaction; if the tx uses less, they get
the difference credited back. Tendermint adopts a similar abstraction,
though uses it only optionally and weakly, allowing applications to define
their own sense of the cost of execution.</p> <p>In Tendermint, the
<a href="../../proto/tendermint/types/params.proto">ConsensusParams.Block.MaxGas</a>
limits the amount of <code>gas</code> that can be used in a block. The default value is
<code>-1</code>, meaning no limit, or that the concept of gas is meaningless.</p> <p>Responses contain a <code>GasWanted</code> and <code>GasUsed</code> field. The former is the maximum
amount of gas the sender of a tx is willing to use, and the later is how much it actually
used. Applications should enforce that <code>GasUsed &lt;= GasWanted</code> - ie. tx execution
should halt before it can use more resources than it requested.</p> <p>When <code>MaxGas &gt; -1</code>, Tendermint enforces the following rules:</p> <ul><li><code>GasWanted &lt;= MaxGas</code> for all txs in the mempool</li> <li><code>(sum of GasWanted in a block) &lt;= MaxGas</code> when proposing a block</li></ul> <p>If <code>MaxGas == -1</code>, no rules about gas are enforced.</p> <p>Note that Tendermint does not currently enforce anything about Gas in the consensus, only the mempool.
This means it does not guarantee that committed blocks satisfy these rules!
It is the application's responsibility to return non-zero response codes when gas limits are exceeded.</p> <p>The <code>GasUsed</code> field is ignored completely by Tendermint. That said, applications should enforce:</p> <ul><li><code>GasUsed &lt;= GasWanted</code> for any given transaction</li> <li><code>(sum of GasUsed in a block) &lt;= MaxGas</code> for every block</li></ul> <p>In the future, we intend to add a <code>Priority</code> field to the responses that can be
used to explicitly prioritize txs in the mempool for inclusion in a block
proposal. See <a href="https://github.com/tendermint/tendermint/issues/1861" target="_blank" rel="noopener noreferrer">#1861<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p> <h3 id="checktx"><a href="#checktx" class="header-anchor">#</a> CheckTx</h3> <p>If <code>Code != 0</code>, it will be rejected from the mempool and hence
not broadcasted to other peers and not included in a proposal block.</p> <p><code>Data</code> contains the result of the CheckTx transaction execution, if any. It is
semantically meaningless to Tendermint.</p> <h3 id="delivertx"><a href="#delivertx" class="header-anchor">#</a> DeliverTx</h3> <p>DeliverTx is the workhorse of the blockchain. Tendermint sends the
DeliverTx requests asynchronously but in order, and relies on the
underlying socket protocol (ie. TCP) to ensure they are received by the
app in order. They have already been ordered in the global consensus by
the Tendermint protocol.</p> <p>If DeliverTx returns <code>Code != 0</code>, the transaction will be considered invalid,
though it is still included in the block.</p> <p>DeliverTx also returns a <a href="../../proto/tendermint/abci/types.proto#L189-L191">Code, Data, and Log</a>.</p> <p><code>Data</code> contains the result of the CheckTx transaction execution, if any. It is
semantically meaningless to Tendermint.</p> <p>Both the <code>Code</code> and <code>Data</code> are included in a structure that is hashed into the
<code>LastResultsHash</code> of the next block header.</p> <p><code>Events</code> include any events for the execution, which Tendermint will use to index
the transaction by. This allows transactions to be queried according to what
events took place during their execution.</p> <h2 id="updating-the-validator-set"><a href="#updating-the-validator-set" class="header-anchor">#</a> Updating the Validator Set</h2> <p>The application may set the validator set during InitChain, and may update it during
EndBlock.</p> <p>Note that the maximum total power of the validator set is bounded by
<code>MaxTotalVotingPower = MaxInt64 / 8</code>. Applications are responsible for ensuring
they do not make changes to the validator set that cause it to exceed this
limit.</p> <p>Additionally, applications must ensure that a single set of updates does not contain any duplicates -
a given public key can only appear once within a given update. If an update includes
duplicates, the block execution will fail irrecoverably.</p> <h3 id="initchain"><a href="#initchain" class="header-anchor">#</a> InitChain</h3> <p>The <code>InitChain</code> method can return a list of validators.
If the list is empty, Tendermint will use the validators loaded in the genesis
file.
If the list returned by <code>InitChain</code> is not empty, Tendermint will use its contents as the validator set.
This way the application can set the initial validator set for the
blockchain.</p> <h3 id="endblock"><a href="#endblock" class="header-anchor">#</a> EndBlock</h3> <p>Updates to the Tendermint validator set can be made by returning
<code>ValidatorUpdate</code> objects in the <code>ResponseEndBlock</code>:</p> <span class="codeblock" data-v-1eda75b2><span class="container codeblock__hasfooter__false codeblock__is-expandable__false codeblock__expanded__false" data-v-1eda75b2><span class="body__container" data-v-1eda75b2><span class="body__block" data-v-1eda75b2><span class="icons" data-v-1eda75b2><!----> <span class="icons__item" data-v-1eda75b2><svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="icons__item__icon" data-v-1eda75b2><path fill-rule="evenodd" clip-rule="evenodd" d="M11 0.25C10.0335 0.25 9.25 1.0335 9.25 2V4.5H10.75V2C10.75 1.86193 10.8619 1.75 11 1.75H21C21.1381 1.75 21.25 1.86193 21.25 2V16C21.25 16.1381 21.1381 16.25 21 16.25H16.5V17.75H21C21.9665 17.75 22.75 16.9665 22.75 16V2C22.75 1.0335 21.9665 0.25 21 0.25H11ZM3 6.25C2.0335 6.25 1.25 7.0335 1.25 8V22C1.25 22.9665 2.0335 23.75 3 23.75H13C13.9665 23.75 14.75 22.9665 14.75 22V8C14.75 7.0335 13.9665 6.25 13 6.25H3ZM2.75 8C2.75 7.86193 2.86193 7.75 3 7.75H13C13.1381 7.75 13.25 7.86193 13.25 8V22C13.25 22.1381 13.1381 22.25 13 22.25H3C2.86193 22.25 2.75 22.1381 2.75 22V8Z" data-v-1eda75b2></path></svg> <span class="icons__item__tooltip" data-v-1eda75b2>
Copy
</span></span></span> <span class="body" data-v-1eda75b2><span class="body__wrapper" data-v-1eda75b2><span class="body__code" data-v-1eda75b2><span class="token keyword">message</span> <span class="token class-name">ValidatorUpdate</span> <span class="token punctuation">{</span>
tendermint<span class="token punctuation">.</span>crypto<span class="token punctuation">.</span>keys<span class="token punctuation">.</span>PublicKey pub_key
<span class="token builtin">int64</span> power
<span class="token punctuation">}</span>
<span class="token keyword">message</span> <span class="token class-name">PublicKey</span> <span class="token punctuation">{</span>
<span class="token keyword">oneof</span> <span class="token punctuation">{</span>
ed25519 <span class="token builtin">bytes</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</span></span></span></span> <!----></span> <!----></span></span> <p>The <code>pub_key</code> currently supports only one type:</p> <ul><li><code>type = &quot;ed25519&quot;</code></li></ul> <p>The <code>power</code> is the new voting power for the validator, with the
following rules:</p> <ul><li>power must be non-negative</li> <li>if power is 0, the validator must already exist, and will be removed from the
validator set</li> <li>if power is non-0:
<ul><li>if the validator does not already exist, it will be added to the validator
set with the given power</li> <li>if the validator does already exist, its power will be adjusted to the given power</li></ul></li> <li>the total power of the new validator set must not exceed MaxTotalVotingPower</li></ul> <p>Note the updates returned in block <code>H</code> will only take effect at block <code>H+2</code>.</p> <h2 id="consensus-parameters"><a href="#consensus-parameters" class="header-anchor">#</a> Consensus Parameters</h2> <p>ConsensusParams enforce certain limits in the blockchain, like the maximum size
of blocks, amount of gas used in a block, and the maximum acceptable age of
evidence. They can be set in InitChain and updated in EndBlock.</p> <h3 id="blockparams-maxbytes"><a href="#blockparams-maxbytes" class="header-anchor">#</a> BlockParams.MaxBytes</h3> <p>The maximum size of a complete Protobuf encoded block.
This is enforced by Tendermint consensus.</p> <p>This implies a maximum transaction size that is this MaxBytes, less the expected size of
the header, the validator set, and any included evidence in the block.</p> <p>Must have <code>0 &lt; MaxBytes &lt; 100 MB</code>.</p> <h3 id="blockparams-maxgas"><a href="#blockparams-maxgas" class="header-anchor">#</a> BlockParams.MaxGas</h3> <p>The maximum of the sum of <code>GasWanted</code> that will be allowed in a proposed block.
This is <em>not</em> enforced by Tendermint consensus.
It is left to the app to enforce (ie. if txs are included past the
limit, they should return non-zero codes). It is used by Tendermint to limit the
txs included in a proposed block.</p> <p>Must have <code>MaxGas &gt;= -1</code>.
If <code>MaxGas == -1</code>, no limit is enforced.</p> <h3 id="blockparams-rechecktx"><a href="#blockparams-rechecktx" class="header-anchor">#</a> BlockParams.RecheckTx</h3> <p>This indicates whether all nodes in the network should perform a <code>CheckTx</code> on all
transactions remaining in the mempool directly <em>after</em> the execution of every block,
i.e. whenever a new application state is created. This is often useful for garbage
collection.</p> <p>The change will come into effect immediately after <code>FinalizeBlock</code> has been
called.</p> <p>This was previously a local mempool config parameter.</p> <h3 id="evidenceparams-maxageduration"><a href="#evidenceparams-maxageduration" class="header-anchor">#</a> EvidenceParams.MaxAgeDuration</h3> <p>This is the maximum age of evidence in time units.
This is enforced by Tendermint consensus.</p> <p>If a block includes evidence older than this (AND the evidence was created more
than <code>MaxAgeNumBlocks</code> ago), the block will be rejected (validators won't vote
for it).</p> <p>Must have <code>MaxAgeDuration &gt; 0</code>.</p> <h3 id="evidenceparams-maxagenumblocks"><a href="#evidenceparams-maxagenumblocks" class="header-anchor">#</a> EvidenceParams.MaxAgeNumBlocks</h3> <p>This is the maximum age of evidence in blocks.
This is enforced by Tendermint consensus.</p> <p>If a block includes evidence older than this (AND the evidence was created more
than <code>MaxAgeDuration</code> ago), the block will be rejected (validators won't vote
for it).</p> <p>Must have <code>MaxAgeNumBlocks &gt; 0</code>.</p> <h3 id="evidenceparams-maxnum"><a href="#evidenceparams-maxnum" class="header-anchor">#</a> EvidenceParams.MaxNum</h3> <p>This is the maximum number of evidence that can be committed to a single block.</p> <p>The product of this and the <code>MaxEvidenceBytes</code> must not exceed the size of
a block minus it's overhead ( ~ <code>MaxBytes</code>).</p> <p>Must have <code>MaxNum &gt; 0</code>.</p> <h3 id="synchronyparams-precision"><a href="#synchronyparams-precision" class="header-anchor">#</a> SynchronyParams.Precision</h3> <p><code>SynchronyParams.Precision</code> is a parameter of the Proposer-Based Timestamps algorithm.
that configures the acceptable upper-bound of clock drift among
all of the nodes on a Tendermint network. Any two nodes on a Tendermint network
are expected to have clocks that differ by at most <code>Precision</code>.</p> <h3 id="synchronyparams-messagedelay"><a href="#synchronyparams-messagedelay" class="header-anchor">#</a> SynchronyParams.MessageDelay</h3> <p><code>SynchronyParams.MessageDelay</code> is a parameter of the Proposer-Based Timestamps
algorithm that configures the acceptable upper-bound for transmitting a <code>Proposal</code>
message from the proposer to all of the validators on the network.</p> <h3 id="updates"><a href="#updates" class="header-anchor">#</a> Updates</h3> <p>The application may set the ConsensusParams during InitChain, and update them during
EndBlock. If the ConsensusParams is empty, it will be ignored. Each field
that is not empty will be applied in full. For instance, if updating the
Block.MaxBytes, applications must also set the other Block fields (like
Block.MaxGas), even if they are unchanged, as they will otherwise cause the
value to be updated to 0.</p> <h4 id="initchain-2"><a href="#initchain-2" class="header-anchor">#</a> InitChain</h4> <p>ResponseInitChain includes a ConsensusParams.
If ConsensusParams is nil, Tendermint will use the params loaded in the genesis
file. If ConsensusParams is not nil, Tendermint will use it.
This way the application can determine the initial consensus params for the
blockchain.</p> <h4 id="endblock-2"><a href="#endblock-2" class="header-anchor">#</a> EndBlock</h4> <p>ResponseEndBlock includes a ConsensusParams.
If ConsensusParams nil, Tendermint will do nothing.
If ConsensusParam is not nil, Tendermint will use it.
This way the application can update the consensus params over time.</p> <p>Note the updates returned in block <code>H</code> will take effect right away for block
<code>H+1</code>.</p> <h2 id="query"><a href="#query" class="header-anchor">#</a> Query</h2> <p>Query is a generic method with lots of flexibility to enable diverse sets
of queries on application state. Tendermint makes use of Query to filter new peers
based on ID and IP, and exposes Query to the user over RPC.</p> <p>Note that calls to Query are not replicated across nodes, but rather query the
local node's state - hence they may return stale reads. For reads that require
consensus, use a transaction.</p> <p>The most important use of Query is to return Merkle proofs of the application state at some height
that can be used for efficient application-specific light-clients.</p> <p>Note Tendermint has technically no requirements from the Query
message for normal operation - that is, the ABCI app developer need not implement
Query functionality if they do not wish too.</p> <h3 id="query-proofs"><a href="#query-proofs" class="header-anchor">#</a> Query Proofs</h3> <p>The Tendermint block header includes a number of hashes, each providing an
anchor for some type of proof about the blockchain. The <code>ValidatorsHash</code> enables
quick verification of the validator set, the <code>DataHash</code> gives quick
verification of the transactions included in the block, etc.</p> <p>The <code>AppHash</code> is unique in that it is application specific, and allows for
application-specific Merkle proofs about the state of the application.
While some applications keep all relevant state in the transactions themselves
(like Bitcoin and its UTXOs), others maintain a separated state that is
computed deterministically <em>from</em> transactions, but is not contained directly in
the transactions themselves (like Ethereum contracts and accounts).
For such applications, the <code>AppHash</code> provides a much more efficient way to verify light-client proofs.</p> <p>ABCI applications can take advantage of more efficient light-client proofs for
their state as follows:</p> <ul><li>return the Merkle root of the deterministic application state in
<code>ResponseCommit.Data</code>. This Merkle root will be included as the <code>AppHash</code> in the next block.</li> <li>return efficient Merkle proofs about that application state in <code>ResponseQuery.Proof</code>
that can be verified using the <code>AppHash</code> of the corresponding block.</li></ul> <p>For instance, this allows an application's light-client to verify proofs of
absence in the application state, something which is much less efficient to do using the block hash.</p> <p>Some applications (eg. Ethereum, Cosmos-SDK) have multiple &quot;levels&quot; of Merkle trees,
where the leaves of one tree are the root hashes of others. To support this, and
the general variability in Merkle proofs, the <code>ResponseQuery.Proof</code> has some minimal structure:</p> <span class="codeblock" data-v-1eda75b2><span class="container codeblock__hasfooter__false codeblock__is-expandable__false codeblock__expanded__false" data-v-1eda75b2><span class="body__container" data-v-1eda75b2><span class="body__block" data-v-1eda75b2><span class="icons" data-v-1eda75b2><!----> <span class="icons__item" data-v-1eda75b2><svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="icons__item__icon" data-v-1eda75b2><path fill-rule="evenodd" clip-rule="evenodd" d="M11 0.25C10.0335 0.25 9.25 1.0335 9.25 2V4.5H10.75V2C10.75 1.86193 10.8619 1.75 11 1.75H21C21.1381 1.75 21.25 1.86193 21.25 2V16C21.25 16.1381 21.1381 16.25 21 16.25H16.5V17.75H21C21.9665 17.75 22.75 16.9665 22.75 16V2C22.75 1.0335 21.9665 0.25 21 0.25H11ZM3 6.25C2.0335 6.25 1.25 7.0335 1.25 8V22C1.25 22.9665 2.0335 23.75 3 23.75H13C13.9665 23.75 14.75 22.9665 14.75 22V8C14.75 7.0335 13.9665 6.25 13 6.25H3ZM2.75 8C2.75 7.86193 2.86193 7.75 3 7.75H13C13.1381 7.75 13.25 7.86193 13.25 8V22C13.25 22.1381 13.1381 22.25 13 22.25H3C2.86193 22.25 2.75 22.1381 2.75 22V8Z" data-v-1eda75b2></path></svg> <span class="icons__item__tooltip" data-v-1eda75b2>
Copy
</span></span></span> <span class="body" data-v-1eda75b2><span class="body__wrapper" data-v-1eda75b2><span class="body__code" data-v-1eda75b2><span class="token keyword">message</span> <span class="token class-name">ProofOps</span> <span class="token punctuation">{</span>
<span class="token keyword">repeated</span> ProofOp ops
<span class="token punctuation">}</span>
<span class="token keyword">message</span> <span class="token class-name">ProofOp</span> <span class="token punctuation">{</span>
<span class="token builtin">string</span> type <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token builtin">bytes</span> key <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token builtin">bytes</span> data <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</span></span></span></span> <!----></span> <!----></span></span> <p>Each <code>ProofOp</code> contains a proof for a single key in a single Merkle tree, of the specified <code>type</code>.
This allows ABCI to support many different kinds of Merkle trees, encoding
formats, and proofs (eg. of presence and absence) just by varying the <code>type</code>.
The <code>data</code> contains the actual encoded proof, encoded according to the <code>type</code>.
When verifying the full proof, the root hash for one ProofOp is the value being
verified for the next ProofOp in the list. The root hash of the final ProofOp in
the list should match the <code>AppHash</code> being verified against.</p> <h3 id="peer-filtering"><a href="#peer-filtering" class="header-anchor">#</a> Peer Filtering</h3> <p>When Tendermint connects to a peer, it sends two queries to the ABCI application
using the following paths, with no additional data:</p> <ul><li><code>/p2p/filter/addr/&lt;IP:PORT&gt;</code>, where <code>&lt;IP:PORT&gt;</code> denote the IP address and
the port of the connection</li> <li><code>p2p/filter/id/&lt;ID&gt;</code>, where <code>&lt;ID&gt;</code> is the peer node ID (ie. the
pubkey.Address() for the peer's PubKey)</li></ul> <p>If either of these queries return a non-zero ABCI code, Tendermint will refuse
to connect to the peer.</p> <h3 id="paths"><a href="#paths" class="header-anchor">#</a> Paths</h3> <p>Queries are directed at paths, and may optionally include additional data.</p> <p>The expectation is for there to be some number of high level paths
differentiating concerns, like <code>/p2p</code>, <code>/store</code>, and <code>/app</code>. Currently,
Tendermint only uses <code>/p2p</code>, for filtering peers. For more advanced use, see the
implementation of
<a href="https://github.com/cosmos/cosmos-sdk/blob/v0.23.1/baseapp/baseapp.go#L333" target="_blank" rel="noopener noreferrer">Query in the Cosmos-SDK<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p> <h2 id="crash-recovery"><a href="#crash-recovery" class="header-anchor">#</a> Crash Recovery</h2> <p>On startup, Tendermint calls the <code>Info</code> method on the Info Connection to get the latest
committed state of the app. The app MUST return information consistent with the
last block it succesfully completed Commit for.</p> <p>If the app succesfully committed block H, then <code>last_block_height = H</code> and <code>last_block_app_hash = &lt;hash returned by Commit for block H&gt;</code>. If the app
failed during the Commit of block H, then <code>last_block_height = H-1</code> and
<code>last_block_app_hash = &lt;hash returned by Commit for block H-1, which is the hash in the header of block H&gt;</code>.</p> <p>We now distinguish three heights, and describe how Tendermint syncs itself with
the app.</p> <span class="codeblock" data-v-1eda75b2><span class="container codeblock__hasfooter__false codeblock__is-expandable__false codeblock__expanded__false" data-v-1eda75b2><span class="body__container" data-v-1eda75b2><span class="body__block" data-v-1eda75b2><span class="icons" data-v-1eda75b2><!----> <span class="icons__item" data-v-1eda75b2><svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="icons__item__icon" data-v-1eda75b2><path fill-rule="evenodd" clip-rule="evenodd" d="M11 0.25C10.0335 0.25 9.25 1.0335 9.25 2V4.5H10.75V2C10.75 1.86193 10.8619 1.75 11 1.75H21C21.1381 1.75 21.25 1.86193 21.25 2V16C21.25 16.1381 21.1381 16.25 21 16.25H16.5V17.75H21C21.9665 17.75 22.75 16.9665 22.75 16V2C22.75 1.0335 21.9665 0.25 21 0.25H11ZM3 6.25C2.0335 6.25 1.25 7.0335 1.25 8V22C1.25 22.9665 2.0335 23.75 3 23.75H13C13.9665 23.75 14.75 22.9665 14.75 22V8C14.75 7.0335 13.9665 6.25 13 6.25H3ZM2.75 8C2.75 7.86193 2.86193 7.75 3 7.75H13C13.1381 7.75 13.25 7.86193 13.25 8V22C13.25 22.1381 13.1381 22.25 13 22.25H3C2.86193 22.25 2.75 22.1381 2.75 22V8Z" data-v-1eda75b2></path></svg> <span class="icons__item__tooltip" data-v-1eda75b2>
Copy
</span></span></span> <span class="body" data-v-1eda75b2><span class="body__wrapper" data-v-1eda75b2><span class="body__code" data-v-1eda75b2>storeBlockHeight = height of the last block Tendermint saw a commit for
stateBlockHeight = height of the last block for which Tendermint completed all
block processing and saved all ABCI results to disk
appBlockHeight = height of the last block for which ABCI app succesfully
completed Commit
</span></span></span></span> <!----></span> <!----></span></span> <p>Note we always have <code>storeBlockHeight &gt;= stateBlockHeight</code> and <code>storeBlockHeight &gt;= appBlockHeight</code>
Note also Tendermint never calls Commit on an ABCI app twice for the same height.</p> <p>The procedure is as follows.</p> <p>First, some simple start conditions:</p> <p>If <code>appBlockHeight == 0</code>, then call InitChain.</p> <p>If <code>storeBlockHeight == 0</code>, we're done.</p> <p>Now, some sanity checks:</p> <p>If <code>storeBlockHeight &lt; appBlockHeight</code>, error
If <code>storeBlockHeight &lt; stateBlockHeight</code>, panic
If <code>storeBlockHeight &gt; stateBlockHeight+1</code>, panic</p> <p>Now, the meat:</p> <p>If <code>storeBlockHeight == stateBlockHeight &amp;&amp; appBlockHeight &lt; storeBlockHeight</code>,
replay all blocks in full from <code>appBlockHeight</code> to <code>storeBlockHeight</code>.
This happens if we completed processing the block, but the app forgot its height.</p> <p>If <code>storeBlockHeight == stateBlockHeight &amp;&amp; appBlockHeight == storeBlockHeight</code>, we're done.
This happens if we crashed at an opportune spot.</p> <p>If <code>storeBlockHeight == stateBlockHeight+1</code>
This happens if we started processing the block but didn't finish.</p> <p>If <code>appBlockHeight &lt; stateBlockHeight</code>
replay all blocks in full from <code>appBlockHeight</code> to <code>storeBlockHeight-1</code>,
and replay the block at <code>storeBlockHeight</code> using the WAL.
This happens if the app forgot the last block it committed.</p> <p>If <code>appBlockHeight == stateBlockHeight</code>,
replay the last block (storeBlockHeight) in full.
This happens if we crashed before the app finished Commit</p> <p>If <code>appBlockHeight == storeBlockHeight</code>
update the state using the saved ABCI responses but dont run the block against the real app.
This happens if we crashed after the app finished Commit but before Tendermint saved the state.</p> <h2 id="state-sync"><a href="#state-sync" class="header-anchor">#</a> State Sync</h2> <p>A new node joining the network can simply join consensus at the genesis height and replay all
historical blocks until it is caught up. However, for large chains this can take a significant
amount of time, often on the order of days or weeks.</p> <p>State sync is an alternative mechanism for bootstrapping a new node, where it fetches a snapshot
of the state machine at a given height and restores it. Depending on the application, this can
be several orders of magnitude faster than replaying blocks.</p> <p>Note that state sync does not currently backfill historical blocks, so the node will have a
truncated block history - users are advised to consider the broader network implications of this in
terms of block availability and auditability. This functionality may be added in the future.</p> <p>For details on the specific ABCI calls and types, see the <a href="/master/spec/abci/abci.html">methods and types section</a>.</p> <h3 id="taking-snapshots"><a href="#taking-snapshots" class="header-anchor">#</a> Taking Snapshots</h3> <p>Applications that want to support state syncing must take state snapshots at regular intervals. How
this is accomplished is entirely up to the application. A snapshot consists of some metadata and
a set of binary chunks in an arbitrary format:</p> <ul><li><p><code>Height (uint64)</code>: The height at which the snapshot is taken. It must be taken after the given
height has been committed, and must not contain data from any later heights.</p></li> <li><p><code>Format (uint32)</code>: An arbitrary snapshot format identifier. This can be used to version snapshot
formats, e.g. to switch from Protobuf to MessagePack for serialization. The application can use
this when restoring to choose whether to accept or reject a snapshot.</p></li> <li><p><code>Chunks (uint32)</code>: The number of chunks in the snapshot. Each chunk contains arbitrary binary
data, and should be less than 16 MB; 10 MB is a good starting point.</p></li> <li><p><code>Hash ([]byte)</code>: An arbitrary hash of the snapshot. This is used to check whether a snapshot is
the same across nodes when downloading chunks.</p></li> <li><p><code>Metadata ([]byte)</code>: Arbitrary snapshot metadata, e.g. chunk hashes for verification or any other
necessary info.</p></li></ul> <p>For a snapshot to be considered the same across nodes, all of these fields must be identical. When
sent across the network, snapshot metadata messages are limited to 4 MB.</p> <p>When a new node is running state sync and discovering snapshots, Tendermint will query an existing
application via the ABCI <code>ListSnapshots</code> method to discover available snapshots, and load binary
snapshot chunks via <code>LoadSnapshotChunk</code>. The application is free to choose how to implement this
and which formats to use, but must provide the following guarantees:</p> <ul><li><p><strong>Consistent:</strong> A snapshot must be taken at a single isolated height, unaffected by
concurrent writes. This can be accomplished by using a data store that supports ACID
transactions with snapshot isolation.</p></li> <li><p><strong>Asynchronous:</strong> Taking a snapshot can be time-consuming, so it must not halt chain progress,
for example by running in a separate thread.</p></li> <li><p><strong>Deterministic:</strong> A snapshot taken at the same height in the same format must be identical
(at the byte level) across nodes, including all metadata. This ensures good availability of
chunks, and that they fit together across nodes.</p></li></ul> <p>A very basic approach might be to use a datastore with MVCC transactions (such as RocksDB),
start a transaction immediately after block commit, and spawn a new thread which is passed the
transaction handle. This thread can then export all data items, serialize them using e.g.
Protobuf, hash the byte stream, split it into chunks, and store the chunks in the file system
along with some metadata - all while the blockchain is applying new blocks in parallel.</p> <p>A more advanced approach might include incremental verification of individual chunks against the
chain app hash, parallel or batched exports, compression, and so on.</p> <p>Old snapshots should be removed after some time - generally only the last two snapshots are needed
(to prevent the last one from being removed while a node is restoring it).</p> <h3 id="bootstrapping-a-node"><a href="#bootstrapping-a-node" class="header-anchor">#</a> Bootstrapping a Node</h3> <p>An empty node can be state synced by setting the configuration option <code>statesync.enabled = true</code>. The node also needs the chain genesis file for basic chain info, and configuration for
light client verification of the restored snapshot: a set of Tendermint RPC servers, and a
trusted header hash and corresponding height from a trusted source, via the <code>statesync</code>
configuration section.</p> <p>Once started, the node will connect to the P2P network and begin discovering snapshots. These
will be offered to the local application via the <code>OfferSnapshot</code> ABCI method. Once a snapshot
is accepted Tendermint will fetch and apply the snapshot chunks. After all chunks have been
successfully applied, Tendermint verifies the app's <code>AppHash</code> against the chain using the light
client, then switches the node to normal consensus operation.</p> <h4 id="snapshot-discovery"><a href="#snapshot-discovery" class="header-anchor">#</a> Snapshot Discovery</h4> <p>When the empty node join the P2P network, it asks all peers to report snapshots via the
<code>ListSnapshots</code> ABCI call (limited to 10 per node). After some time, the node picks the most
suitable snapshot (generally prioritized by height, format, and number of peers), and offers it
to the application via <code>OfferSnapshot</code>. The application can choose a number of responses,
including accepting or rejecting it, rejecting the offered format, rejecting the peer who sent
it, and so on. Tendermint will keep discovering and offering snapshots until one is accepted or
the application aborts.</p> <h4 id="snapshot-restoration"><a href="#snapshot-restoration" class="header-anchor">#</a> Snapshot Restoration</h4> <p>Once a snapshot has been accepted via <code>OfferSnapshot</code>, Tendermint begins downloading chunks from
any peers that have the same snapshot (i.e. that have identical metadata fields). Chunks are
spooled in a temporary directory, and then given to the application in sequential order via
<code>ApplySnapshotChunk</code> until all chunks have been accepted.</p> <p>The method for restoring snapshot chunks is entirely up to the application.</p> <p>During restoration, the application can respond to <code>ApplySnapshotChunk</code> with instructions for how
to continue. This will typically be to accept the chunk and await the next one, but it can also
ask for chunks to be refetched (either the current one or any number of previous ones), P2P peers
to be banned, snapshots to be rejected or retried, and a number of other responses - see the ABCI
reference for details.</p> <p>If Tendermint fails to fetch a chunk after some time, it will reject the snapshot and try a
different one via <code>OfferSnapshot</code> - the application can choose whether it wants to support
restarting restoration, or simply abort with an error.</p> <h4 id="snapshot-verification"><a href="#snapshot-verification" class="header-anchor">#</a> Snapshot Verification</h4> <p>Once all chunks have been accepted, Tendermint issues an <code>Info</code> ABCI call to retrieve the
<code>LastBlockAppHash</code>. This is compared with the trusted app hash from the chain, retrieved and
verified using the light client. Tendermint also checks that <code>LastBlockHeight</code> corresponds to the
height of the snapshot.</p> <p>This verification ensures that an application is valid before joining the network. However, the
snapshot restoration may take a long time to complete, so applications may want to employ additional
verification during the restore to detect failures early. This might e.g. include incremental
verification of each chunk against the app hash (using bundled Merkle proofs), checksums to
protect against data corruption by the disk or network, and so on. However, it is important to
note that the only trusted information available is the app hash, and all other snapshot metadata
can be spoofed by adversaries.</p> <p>Apps may also want to consider state sync denial-of-service vectors, where adversaries provide
invalid or harmful snapshots to prevent nodes from joining the network. The application can
counteract this by asking Tendermint to ban peers. As a last resort, node operators can use
P2P configuration options to whitelist a set of trusted peers that can provide valid snapshots.</p> <h4 id="transition-to-consensus"><a href="#transition-to-consensus" class="header-anchor">#</a> Transition to Consensus</h4> <p>Once the snapshots have all been restored, Tendermint gathers additional information necessary for
bootstrapping the node (e.g. chain ID, consensus parameters, validator sets, and block headers)
from the genesis file and light client RPC servers. It also fetches and records the <code>AppVersion</code>
from the ABCI application.</p> <p>Once the state machine has been restored and Tendermint has gathered this additional
information, it transitions to block sync (if enabled) to fetch any remaining blocks up the chain
head, and then transitions to regular consensus operation. At this point the node operates like
any other node, apart from having a truncated block history at the height of the restored snapshot.</p></div><!----></div></div></div></div><div class="layout__main__content__aside__container" style="--height-banners:nullpx;" data-v-58560e81><div class="layout__main__content__aside aside__bottom__false" data-v-58560e81><!----></div><div class="layout__main__content__aside__banners" data-v-58560e81><a href="https://github.com/tendermint/tendermint/issues" target="_blank" data-v-58560e81><div data-v-31935645 data-v-58560e81><div class="container" data-v-31935645><svg width="100%" height="100%" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" class="icon" data-v-31935645><path d="M0.836491 13.7697C0.543598 14.0626 0.543598 14.5374 0.836492 14.8303C1.12939 15.1232 1.60426 15.1232 1.89715 14.8303L0.836491 13.7697ZM14.7729 1.95457C15.0658 1.66168 15.0658 1.1868 14.7729 0.893912C14.48 0.601019 14.0051 0.601019 13.7122 0.893913L14.7729 1.95457ZM14.6668 1H15.4168V0.25H14.6668V1ZM4.48498 0.25C4.07077 0.25 3.73498 0.585786 3.73498 1C3.73498 1.41421 4.07077 1.75 4.48498 1.75V0.25ZM13.9168 11.1818C13.9168 11.596 14.2526 11.9318 14.6668 11.9318C15.081 11.9318 15.4168 11.596 15.4168 11.1818H13.9168ZM1.89715 14.8303L14.7729 1.95457L13.7122 0.893913L0.836491 13.7697L1.89715 14.8303ZM14.6668 0.25H4.48498V1.75H14.6668V0.25ZM15.4168 11.1818V1H13.9168V11.1818H15.4168Z"></path></svg><div class="image" data-v-31935645><svg width="41" height="44" viewBox="0 0 41 44" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-31935645><path fill-rule="evenodd" clip-rule="evenodd" d="M4 1.8999H32C33.3807 1.8999 34.5 3.01919 34.5 4.3999V10.997L36 9.497V4.3999C36 2.19076 34.2091 0.399902 32 0.399902H4C1.79086 0.399902 0 2.19077 0 4.39991V39.5999C0 41.809 1.79086 43.5999 4 43.5999H32C34.2091 43.5999 36 41.809 36 39.5999V20.2096L34.5 21.7096V39.5999C34.5 40.9806 33.3807 42.0999 32 42.0999H4C2.61929 42.0999 1.5 40.9806 1.5 39.5999V4.39991C1.5 3.01919 2.61929 1.8999 4 1.8999ZM7.2 19.1999H26.2971L24.2971 21.1999H7.2V19.1999ZM7.2 15.7999H28.8V13.7999H7.2V15.7999ZM7.2 26.5999H16.2V24.5999H7.2V26.5999ZM20.8638 25.7372L20.7386 25.8624L20.6826 26.0303L18.9855 31.1215L18.4792 32.6406L19.9704 32.0571L24.8494 30.1479L24.9955 30.0908L25.1064 29.9798L37.9799 17.1063L39.7831 15.3032C40.9546 14.1316 40.9546 12.2321 39.7831 11.0606C38.6115 9.88898 36.712 9.88898 35.5404 11.0606L20.8638 25.7372ZM20.9149 30.0767L22.0496 26.6726L36.6011 12.1212C37.1869 11.5354 38.1366 11.5354 38.7224 12.1212C39.3082 12.707 39.3082 13.6567 38.7224 14.2425L37.4496 15.5153L36.2465 14.3122C35.9536 14.0193 35.4787 14.0193 35.1858 14.3122C34.8929 14.6051 34.8929 15.08 35.1858 15.3729L36.3889 16.576L24.5761 28.3888L23.6215 27.4342C23.3286 27.1413 22.8537 27.1413 22.5608 27.4342C22.2679 27.7271 22.2679 28.202 22.5608 28.4949L23.2349 29.1689L20.9149 30.0767Z" fill="var(--color-primary, blue)" data-v-31935645></path></svg></div><div class="h1" data-v-31935645>Found an Issue?</div><div class="h2" data-v-31935645>Help us improve this page by suggesting edits on GitHub.</div></div></div></a></div></div></div><div class="layout__main__gutter" data-v-58560e81><div data-v-15325c0d data-v-58560e81><div class="links" data-v-15325c0d><div class="links__wrapper" data-v-15325c0d><div class="links__container" data-v-15325c0d><a href="/master/spec/abci/abci.html" class="links__item links__item__left" data-v-15325c0d><div class="links__item__icon" data-v-15325c0d><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 64 64" data-v-15325c0d><title data-v-15325c0d>arrow-right</title><g stroke-linecap="square" stroke-linejoin="miter" stroke-width="2" data-v-15325c0d><line fill="none" stroke-miterlimit="10" x1="61" y1="32" x2="3" y2="32" stroke-linecap="butt" data-v-15325c0d></line><polyline fill="none" stroke-miterlimit="10" points="21,14 3,32 21,50 " data-v-15325c0d></polyline></g></svg></div><div data-v-15325c0d><div class="links__label" data-v-15325c0d>Previous</div><div class="links__item__title" data-v-15325c0d>Methods and Types</div><!----></div></a></div></div><div class="links__wrapper" data-v-15325c0d><div class="links__container" data-v-15325c0d><a href="/master/spec/abci/client-server.html" class="links__item links__item__right" data-v-15325c0d><div data-v-15325c0d><div class="links__label" data-v-15325c0d>Next</div><div class="links__item__title" data-v-15325c0d>Client and Server</div><!----></div><div class="links__item__icon" data-v-15325c0d><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 64 64" data-v-15325c0d><title data-v-15325c0d>arrow-right</title><g stroke-linecap="square" stroke-linejoin="miter" stroke-width="2" data-v-15325c0d><line fill="none" stroke-miterlimit="10" x1="3" y1="32" x2="61" y2="32" stroke-linecap="butt" data-v-15325c0d></line><polyline fill="none" stroke-miterlimit="10" points="43,14 61,32 43,50 " data-v-15325c0d></polyline></g></svg></div></a></div></div></div></div></div><div class="layout__main__footer" data-v-58560e81><div data-v-732a47ec data-v-58560e81><div class="wrapper" data-v-732a47ec><div class="container" data-v-732a47ec><div class="footer__wrapper" data-v-732a47ec><div class="questions" data-v-732a47ec><div class="questions__wrapper" data-v-732a47ec><div class="questions__h1" data-v-732a47ec>Questions?</div><div class="questions__p" data-v-732a47ec><div>Chat with Tendermint developers in <a href='https://discord.gg/cosmosnetwork' target='_blank'>Discord</a> or reach out on the <a href='https://forum.cosmos.network/c/tendermint' target='_blank'>Tendermint Forum</a> to learn more.</div></div></div><form action="https://app.mailerlite.com/webforms/submit/u7o3l7" data-code="u7o3l7" method="POST" target="_blank" rel="noreferrer noopener" class="newsletter__form__component__internal" data-v-fd618d74 data-v-732a47ec><div class="newsletter__desc" data-v-fd618d74><div class="newsletter__desc__h1" data-v-fd618d74><label for="newsletter-email-input" data-v-fd618d74>Get Cosmos updates</label></div><div class="newsletter__desc__p" data-v-fd618d74>Youll be notified with Cosmos updates, news and announcements.</div></div><div class="newsletter__input" data-v-fd618d74><div class="newsletter__input__input" data-v-fd618d74><input type="email" required="required" name="fields[email]" id="newsletter-email-input" placeholder="Your email" class="newsletter__input__input__el" data-v-fd618d74><button type="submit" class="newsletter__input__input__button" data-v-fd618d74>Sign up</button><input type="hidden" name="ml-submit" value="1" data-v-fd618d74></div><div class="newsletter__input__p" data-v-fd618d74>You can unsubscribe at any time.</div></div></form></div><!----><div class="logo" data-v-732a47ec><div class="logo__item" data-v-732a47ec><a href="https://tendermint.com" target="_blank" rel="noreferrer noopener" tag="div" class="logo__image" data-v-732a47ec><svg width="100%" height="100%" viewBox="0 0 142 20" fill="black" xmlns="http://www.w3.org/2000/svg" data-v-732a47ec><path d="M33.5369 19.2904H35.9969V7.57038H40.4569V5.29038H29.0769V7.57038H33.5369V19.2904ZM45.3214 19.5304C47.2614 19.5304 48.6414 18.7504 49.6414 17.5504L48.2214 16.2904C47.3814 17.1104 46.5414 17.5504 45.3614 17.5504C43.8014 17.5504 42.5814 16.5904 42.3214 14.8704H50.0814C50.1014 14.6304 50.1214 14.4104 50.1214 14.1904C50.1214 11.1504 48.4214 8.51038 45.0614 8.51038C42.0414 8.51038 39.9014 10.9904 39.9014 14.0104V14.0504C39.9014 17.3104 42.2614 19.5304 45.3214 19.5304ZM42.3014 13.2704C42.5214 11.6304 43.5614 10.4904 45.0414 10.4904C46.6414 10.4904 47.5614 11.7104 47.7214 13.2704H42.3014ZM52.5317 19.2904H54.9717V13.3304C54.9717 11.6904 55.9517 10.7104 57.3517 10.7104C58.7917 10.7104 59.6117 11.6504 59.6117 13.2904V19.2904H62.0317V12.5504C62.0317 10.1104 60.6517 8.51038 58.2717 8.51038C56.6317 8.51038 55.6517 9.37038 54.9717 10.3504V8.73038H52.5317V19.2904ZM69.3141 19.5104C71.0341 19.5104 72.1341 18.6304 72.9141 17.5304V19.2904H75.3341V4.69038H72.9141V10.3704C72.1541 9.37038 71.0541 8.51038 69.3141 8.51038C66.7941 8.51038 64.4141 10.4904 64.4141 13.9904V14.0304C64.4141 17.5304 66.8341 19.5104 69.3141 19.5104ZM69.8941 17.4104C68.2541 17.4104 66.8541 16.0704 66.8541 14.0304V13.9904C66.8541 11.9104 68.2341 10.6104 69.8941 10.6104C71.5141 10.6104 72.9541 11.9504 72.9541 13.9904V14.0304C72.9541 16.0504 71.5141 17.4104 69.8941 17.4104ZM83.212 19.5304C85.152 19.5304 86.532 18.7504 87.532 17.5504L86.112 16.2904C85.272 17.1104 84.432 17.5504 83.252 17.5504C81.692 17.5504 80.472 16.5904 80.212 14.8704H87.972C87.992 14.6304 88.012 14.4104 88.012 14.1904C88.012 11.1504 86.312 8.51038 82.952 8.51038C79.932 8.51038 77.792 10.9904 77.792 14.0104V14.0504C77.792 17.3104 80.152 19.5304 83.212 19.5304ZM80.192 13.2704C80.412 11.6304 81.452 10.4904 82.932 10.4904C84.532 10.4904 85.452 11.7104 85.612 13.2704H80.192ZM90.4223 19.2904H92.8623V15.2704C92.8623 12.4704 94.3423 11.0904 96.4623 11.0904H96.6023V8.53038C94.7423 8.45038 93.5223 9.53038 92.8623 11.1104V8.73038H90.4223V19.2904ZM98.6841 19.2904H101.124V13.3304C101.124 11.7104 102.044 10.7104 103.384 10.7104C104.724 10.7104 105.524 11.6304 105.524 13.2704V19.2904H107.944V13.3304C107.944 11.6304 108.884 10.7104 110.204 10.7104C111.564 10.7104 112.344 11.6104 112.344 13.2904V19.2904H114.764V12.5504C114.764 9.97038 113.364 8.51038 111.064 8.51038C109.464 8.51038 108.344 9.25038 107.504 10.3704C106.944 9.25038 105.864 8.51038 104.344 8.51038C102.724 8.51038 101.804 9.39038 101.124 10.3304V8.73038H98.6841V19.2904ZM117.728 7.11038H120.328V4.81038H117.728V7.11038ZM117.808 19.2904H120.248V8.73038H117.808V19.2904ZM123.391 19.2904H125.831V13.3304C125.831 11.6904 126.811 10.7104 128.211 10.7104C129.651 10.7104 130.471 11.6504 130.471 13.2904V19.2904H132.891V12.5504C132.891 10.1104 131.511 8.51038 129.131 8.51038C127.491 8.51038 126.511 9.37038 125.831 10.3504V8.73038H123.391V19.2904ZM139.353 19.4704C140.273 19.4704 140.933 19.2704 141.533 18.9304V16.9504C141.053 17.1904 140.573 17.3104 140.033 17.3104C139.213 17.3104 138.733 16.9304 138.733 15.9904V10.8104H141.573V8.73038H138.733V5.83038H136.313V8.73038H134.973V10.8104H136.313V16.3704C136.313 18.6904 137.573 19.4704 139.353 19.4704Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.8359 8.62449C13.6297 8.17373 12.3308 7.93828 11.0189 7.93828C8.26156 7.93828 5.66799 8.96445 3.71603 10.8277C1.77253 12.6827 0.692757 15.1469 0.675382 17.7662L0.67308 18.1179L0.995493 18.2917C2.54939 19.1298 4.30666 19.5708 6.08735 19.5708C6.13631 19.5708 6.18567 19.5704 6.23475 19.5697C7.78697 19.5486 9.32263 19.1947 10.7148 18.5417C10.2758 18.3089 9.85515 18.0468 9.45524 17.7578C7.02864 18.664 4.27847 18.5523 1.95105 17.4173C2.17744 12.8209 6.16956 9.13899 11.0189 9.13899C12.3676 9.13899 13.6998 9.42181 14.903 9.95924C14.9185 9.51427 14.8962 9.06826 14.8359 8.62449"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M21.3623 17.6846C21.3253 14.4281 19.6525 11.4569 16.864 9.64708C16.8661 10.1236 16.8325 10.5998 16.7635 11.0733C18.7449 12.6069 19.9528 14.8652 20.085 17.3394C15.8109 19.4271 10.4806 17.965 8.05257 13.9755C7.39676 12.8979 6.99466 11.693 6.87649 10.4619C6.46399 10.6752 6.07001 10.9205 5.69806 11.1956C5.89419 12.3803 6.32039 13.5309 6.95641 14.5759C8.33758 16.8453 10.5581 18.4723 13.2087 19.1571C14.108 19.3895 15.0224 19.5045 15.9317 19.5045C17.7034 19.5045 19.4562 19.068 21.0421 18.213L21.3662 18.0382L21.3623 17.6846Z"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M11.3845 1.1535L11.0648 0.975742L10.745 1.15323C9.16521 2.02964 7.85272 3.28619 6.94934 4.78692C6.16925 6.08298 5.70784 7.5348 5.59962 9.01676C6.0321 8.77307 6.48263 8.55879 6.94848 8.37569C7.34977 5.93272 8.84843 3.72483 11.0642 2.37561C15.1338 4.85607 16.4721 9.999 14.0276 14.0154C13.3657 15.1031 12.4605 16.0436 11.3882 16.7656C11.7887 16.9971 12.2093 17.1981 12.6463 17.3662C13.6376 16.6043 14.4816 15.671 15.1238 14.6157C17.9778 9.92641 16.3003 3.88731 11.3845 1.1535"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M11.0584 11.4001C10.4754 11.4001 10.0012 11.85 10.0012 12.4031C10.0012 12.9561 10.4754 13.4061 11.0584 13.4061C11.6415 13.4061 12.1158 12.9561 12.1158 12.4031C12.1158 11.85 11.6415 11.4001 11.0584 11.4001M11.0584 14.6068C9.77747 14.6068 8.73544 13.6183 8.73544 12.4031C8.73544 11.188 9.77747 10.1994 11.0584 10.1994C12.3394 10.1994 13.3815 11.188 13.3815 12.4031C13.3815 13.6183 12.3394 14.6068 11.0584 14.6068"></path></svg></a></div><div class="logo__item logo__link" data-v-732a47ec><a href="https://medium.com/@tendermint" target="_blank" title="medium" rel="noreferrer noopener" class="smallprint__item__links__item" data-v-732a47ec><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" fill="#aaa" data-v-732a47ec><path d="M24 24h-24v-24h24v24zm-4.03-5.649v-.269l-1.247-1.224c-.11-.084-.165-.222-.142-.359v-8.998c-.023-.137.032-.275.142-.359l1.277-1.224v-.269h-4.422l-3.152 7.863-3.586-7.863h-4.638v.269l1.494 1.799c.146.133.221.327.201.523v7.072c.044.255-.037.516-.216.702l-1.681 2.038v.269h4.766v-.269l-1.681-2.038c-.181-.186-.266-.445-.232-.702v-6.116l4.183 9.125h.486l3.593-9.125v7.273c0 .194 0 .232-.127.359l-1.292 1.254v.269h6.274z" data-v-732a47ec></path></svg></a><a href="https://twitter.com/tendermint_team" target="_blank" title="twitter" rel="noreferrer noopener" class="smallprint__item__links__item" data-v-732a47ec><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" fill="#aaa" data-v-732a47ec><path d="M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z" data-v-732a47ec></path></svg></a><a href="https://www.linkedin.com/company/tendermint/" target="_blank" title="linkedin" rel="noreferrer noopener" class="smallprint__item__links__item" data-v-732a47ec><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" fill="#aaa" data-v-732a47ec><path d="M0 0v24h24v-24h-24zm8 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.397-2.586 7-2.777 7 2.476v6.759z" data-v-732a47ec></path></svg></a><a href="https://reddit.com/r/cosmosnetwork" target="_blank" title="reddit" rel="noreferrer noopener" class="smallprint__item__links__item" data-v-732a47ec><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" fill="#aaa" data-v-732a47ec><path d="M14.238 15.348c.085.084.085.221 0 .306-.465.462-1.194.687-2.231.687l-.008-.002-.008.002c-1.036 0-1.766-.225-2.231-.688-.085-.084-.085-.221 0-.305.084-.084.222-.084.307 0 .379.377 1.008.561 1.924.561l.008.002.008-.002c.915 0 1.544-.184 1.924-.561.085-.084.223-.084.307 0zm-3.44-2.418c0-.507-.414-.919-.922-.919-.509 0-.923.412-.923.919 0 .506.414.918.923.918.508.001.922-.411.922-.918zm13.202-.93c0 6.627-5.373 12-12 12s-12-5.373-12-12 5.373-12 12-12 12 5.373 12 12zm-5-.129c0-.851-.695-1.543-1.55-1.543-.417 0-.795.167-1.074.435-1.056-.695-2.485-1.137-4.066-1.194l.865-2.724 2.343.549-.003.034c0 .696.569 1.262 1.268 1.262.699 0 1.267-.566 1.267-1.262s-.568-1.262-1.267-1.262c-.537 0-.994.335-1.179.804l-2.525-.592c-.11-.027-.223.037-.257.145l-.965 3.038c-1.656.02-3.155.466-4.258 1.181-.277-.255-.644-.415-1.05-.415-.854.001-1.549.693-1.549 1.544 0 .566.311 1.056.768 1.325-.03.164-.05.331-.05.5 0 2.281 2.805 4.137 6.253 4.137s6.253-1.856 6.253-4.137c0-.16-.017-.317-.044-.472.486-.261.82-.766.82-1.353zm-4.872.141c-.509 0-.922.412-.922.919 0 .506.414.918.922.918s.922-.412.922-.918c0-.507-.413-.919-.922-.919z" data-v-732a47ec></path></svg></a><a href="https://t.me/cosmosproject" target="_blank" title="telegram" rel="noreferrer noopener" class="smallprint__item__links__item" data-v-732a47ec><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" fill="#aaa" data-v-732a47ec><path d="M12,0c-6.626,0 -12,5.372 -12,12c0,6.627 5.374,12 12,12c6.627,0 12,-5.373 12,-12c0,-6.628 -5.373,-12 -12,-12Zm3.224,17.871c0.188,0.133 0.43,0.166 0.646,0.085c0.215,-0.082 0.374,-0.267 0.422,-0.491c0.507,-2.382 1.737,-8.412 2.198,-10.578c0.035,-0.164 -0.023,-0.334 -0.151,-0.443c-0.129,-0.109 -0.307,-0.14 -0.465,-0.082c-2.446,0.906 -9.979,3.732 -13.058,4.871c-0.195,0.073 -0.322,0.26 -0.316,0.467c0.007,0.206 0.146,0.385 0.346,0.445c1.381,0.413 3.193,0.988 3.193,0.988c0,0 0.847,2.558 1.288,3.858c0.056,0.164 0.184,0.292 0.352,0.336c0.169,0.044 0.348,-0.002 0.474,-0.121c0.709,-0.669 1.805,-1.704 1.805,-1.704c0,0 2.084,1.527 3.266,2.369Zm-6.423,-5.062l0.98,3.231l0.218,-2.046c0,0 3.783,-3.413 5.941,-5.358c0.063,-0.057 0.071,-0.153 0.019,-0.22c-0.052,-0.067 -0.148,-0.083 -0.219,-0.037c-2.5,1.596 -6.939,4.43 -6.939,4.43Z" data-v-732a47ec></path></svg></a><a href="https://www.youtube.com/c/CosmosProject" target="_blank" title="youtube" rel="noreferrer noopener" class="smallprint__item__links__item" data-v-732a47ec><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" fill="#aaa" data-v-732a47ec><path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z" data-v-732a47ec></path></svg></a></div></div><div class="smallprint" data-v-732a47ec><div class="smallprint__item smallprint__item__links" data-v-732a47ec><a href="https://tendermint.com" data-v-732a47ec>tendermint.com</a></div><div class="smallprint__item__desc smallprint__item" data-v-732a47ec><div>The development of Tendermint Core was led primarily by All in Bits, Inc. The Tendermint trademark is owned by New Tendermint, LLC.</div></div></div></div></div></div></div></div></div></div><div class="sheet__sidebar" data-v-ec82e5e0 data-v-58560e81><!----> <!----></div><div class="sheet__sidebar" data-v-ec82e5e0 data-v-58560e81><!----> <!----></div><div class="sheet__sidebar sheet__sidebar__toc" data-v-ec82e5e0 data-v-58560e81><!----> <!----></div></div><div class="global-ui"></div></div>
<script src="/master/assets/js/app.d8230444.js" defer></script><script src="/master/assets/js/24.7da7f2cf.js" defer></script><script src="/master/assets/js/21.92fb7737.js" defer></script><script src="/master/assets/js/44.a966f787.js" defer></script><script src="/master/assets/js/19.a758649d.js" defer></script><script src="/master/assets/js/66.1a996a52.js" defer></script><script src="/master/assets/js/64.602a26f4.js" defer></script><script src="/master/assets/js/65.224ad1ec.js" defer></script><script src="/master/assets/js/25.c1f919e6.js" defer></script><script src="/master/assets/js/56.714e246c.js" defer></script><script src="/master/assets/js/62.c200562d.js" defer></script><script src="/master/assets/js/40.bbfd2b95.js" defer></script><script src="/master/assets/js/10.3cf8ba3a.js" defer></script><script src="/master/assets/js/7.c795f92d.js" defer></script><script src="/master/assets/js/184.681becb1.js" defer></script><script src="/master/assets/js/2.21a3b73d.js" defer></script><script src="/master/assets/js/5.4af69dfc.js" defer></script><script src="/master/assets/js/38.933ad5bd.js" defer></script><script src="/master/assets/js/13.cd4f8d8e.js" defer></script><script src="/master/assets/js/12.cf95ee24.js" defer></script><script src="/master/assets/js/16.e0a6886e.js" defer></script><script src="/master/assets/js/45.1110ab59.js" defer></script><script src="/master/assets/js/20.c6a2fb05.js" defer></script>
</body>
</html>