solana-docs 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (924) hide show
  1. package/.eslintignore +8 -0
  2. package/.eslintrc +21 -0
  3. package/.prettierignore +7 -0
  4. package/.travis/before_install.sh +9 -0
  5. package/.travis/script.sh +4 -0
  6. package/README.md +59 -0
  7. package/art/data-plane-fanout.bob +19 -0
  8. package/art/data-plane-neighborhood.bob +25 -0
  9. package/art/data-plane-seeding.bob +15 -0
  10. package/art/data-plane.bob +18 -0
  11. package/art/fork-generation.bob +13 -0
  12. package/art/forks-pruned.bob +9 -0
  13. package/art/forks-pruned2.bob +11 -0
  14. package/art/forks.bob +13 -0
  15. package/art/passive-staking-callflow.msc +30 -0
  16. package/art/retransmit_stage.bob +45 -0
  17. package/art/runtime.bob +10 -0
  18. package/art/sdk-tools.bob +20 -0
  19. package/art/spv-bank-hash.bob +19 -0
  20. package/art/spv-block-merkle.bob +19 -0
  21. package/art/tpu.bob +19 -0
  22. package/art/tvu.bob +37 -0
  23. package/art/validator-proposal.bob +60 -0
  24. package/art/validator.bob +30 -0
  25. package/babel.config.js +3 -0
  26. package/build-cli-usage.sh +42 -0
  27. package/build.sh +40 -0
  28. package/convert-ascii-to-svg.sh +21 -0
  29. package/crowdin.yml +16 -0
  30. package/docusaurus.config.js +161 -0
  31. package/offline-cmd-md-links.sh +11 -0
  32. package/package.json +50 -0
  33. package/publish-docs.sh +56 -0
  34. package/set-solana-release-tag.sh +20 -0
  35. package/sidebars.js +210 -0
  36. package/src/cli/.usage.md.header +59 -0
  37. package/src/cli/choose-a-cluster.md +43 -0
  38. package/src/cli/conventions.md +80 -0
  39. package/src/cli/delegate-stake.md +206 -0
  40. package/src/cli/deploy-a-program.md +302 -0
  41. package/src/cli/install-solana-cli-tools.md +164 -0
  42. package/src/cli/transfer-tokens.md +158 -0
  43. package/src/cli.md +22 -0
  44. package/src/cluster/bench-tps.md +129 -0
  45. package/src/cluster/fork-generation.md +64 -0
  46. package/src/cluster/leader-rotation.md +88 -0
  47. package/src/cluster/managing-forks.md +36 -0
  48. package/src/cluster/overview.md +39 -0
  49. package/src/cluster/performance-metrics.md +25 -0
  50. package/src/cluster/rpc-endpoints.md +50 -0
  51. package/src/cluster/stake-delegation-and-rewards.md +197 -0
  52. package/src/cluster/synchronization.md +28 -0
  53. package/src/cluster/turbine-block-propagation.md +101 -0
  54. package/src/cluster/vote-signing.md +59 -0
  55. package/src/clusters.md +173 -0
  56. package/src/css/custom.css +73 -0
  57. package/src/developing/backwards-compatibility.md +151 -0
  58. package/src/developing/clients/javascript-api.md +332 -0
  59. package/src/developing/clients/javascript-reference.md +750 -0
  60. package/src/developing/clients/jsonrpc-api.md +5173 -0
  61. package/src/developing/clients/rust-api.md +36 -0
  62. package/src/developing/on-chain-programs/debugging.md +110 -0
  63. package/src/developing/on-chain-programs/deploying.md +24 -0
  64. package/src/developing/on-chain-programs/developing-c.md +202 -0
  65. package/src/developing/on-chain-programs/developing-rust.md +406 -0
  66. package/src/developing/on-chain-programs/examples.md +61 -0
  67. package/src/developing/on-chain-programs/faq.md +81 -0
  68. package/src/developing/on-chain-programs/overview.md +218 -0
  69. package/src/developing/plugins/accountsdb_plugin.md +360 -0
  70. package/src/developing/programming-model/accounts.md +231 -0
  71. package/src/developing/programming-model/calling-between-programs.md +351 -0
  72. package/src/developing/programming-model/overview.md +17 -0
  73. package/src/developing/programming-model/runtime.md +131 -0
  74. package/src/developing/programming-model/transactions.md +210 -0
  75. package/src/developing/runtime-facilities/programs.md +168 -0
  76. package/src/developing/runtime-facilities/sysvars.md +142 -0
  77. package/src/developing/test-validator.md +153 -0
  78. package/src/economics_overview.md +20 -0
  79. package/src/history.md +60 -0
  80. package/src/icons/Archivers.inline.svg +11 -0
  81. package/src/icons/Bulb.inline.svg +13 -0
  82. package/src/icons/Chat.inline.svg +10 -0
  83. package/src/icons/Clipboard.inline.svg +13 -0
  84. package/src/icons/Cloudbreak.inline.svg +11 -0
  85. package/src/icons/Code.inline.svg +11 -0
  86. package/src/icons/Fire.inline.svg +10 -0
  87. package/src/icons/Gamepad.inline.svg +11 -0
  88. package/src/icons/Globe.inline.svg +1 -0
  89. package/src/icons/Gulfstream.inline.svg +11 -0
  90. package/src/icons/History.inline.svg +11 -0
  91. package/src/icons/Money.inline.svg +11 -0
  92. package/src/icons/Pipeline.inline.svg +15 -0
  93. package/src/icons/PoH.inline.svg +11 -0
  94. package/src/icons/Sealevel.inline.svg +11 -0
  95. package/src/icons/Tools.inline.svg +11 -0
  96. package/src/icons/Tower.inline.svg +11 -0
  97. package/src/icons/Turbine.inline.svg +12 -0
  98. package/src/icons/duotone-icons/Clothes/Brassiere.svg +10 -0
  99. package/src/icons/duotone-icons/Clothes/Briefcase.svg +11 -0
  100. package/src/icons/duotone-icons/Clothes/Cap.svg +11 -0
  101. package/src/icons/duotone-icons/Clothes/Crown.svg +11 -0
  102. package/src/icons/duotone-icons/Clothes/Dress.svg +11 -0
  103. package/src/icons/duotone-icons/Clothes/Hanger.svg +10 -0
  104. package/src/icons/duotone-icons/Clothes/Hat.svg +11 -0
  105. package/src/icons/duotone-icons/Clothes/Panties.svg +10 -0
  106. package/src/icons/duotone-icons/Clothes/Shirt.svg +11 -0
  107. package/src/icons/duotone-icons/Clothes/Shoes.svg +11 -0
  108. package/src/icons/duotone-icons/Clothes/Shorts.svg +10 -0
  109. package/src/icons/duotone-icons/Clothes/Sneakers.svg +11 -0
  110. package/src/icons/duotone-icons/Clothes/Socks.svg +11 -0
  111. package/src/icons/duotone-icons/Clothes/Sun-glasses.svg +11 -0
  112. package/src/icons/duotone-icons/Clothes/T-Shirt.svg +10 -0
  113. package/src/icons/duotone-icons/Clothes/Tie.svg +11 -0
  114. package/src/icons/duotone-icons/Code/Backspace.svg +11 -0
  115. package/src/icons/duotone-icons/Code/CMD.svg +10 -0
  116. package/src/icons/duotone-icons/Code/Code.inline.svg +11 -0
  117. package/src/icons/duotone-icons/Code/Commit.svg +11 -0
  118. package/src/icons/duotone-icons/Code/Compiling.inline.svg +11 -0
  119. package/src/icons/duotone-icons/Code/Control.svg +10 -0
  120. package/src/icons/duotone-icons/Code/Done-circle.svg +11 -0
  121. package/src/icons/duotone-icons/Code/Error-circle.svg +11 -0
  122. package/src/icons/duotone-icons/Code/Git#1.svg +12 -0
  123. package/src/icons/duotone-icons/Code/Git#2.svg +15 -0
  124. package/src/icons/duotone-icons/Code/Git#3.svg +13 -0
  125. package/src/icons/duotone-icons/Code/Git#4.svg +13 -0
  126. package/src/icons/duotone-icons/Code/Github.svg +11 -0
  127. package/src/icons/duotone-icons/Code/Info-circle.svg +12 -0
  128. package/src/icons/duotone-icons/Code/Left-circle.svg +11 -0
  129. package/src/icons/duotone-icons/Code/Loading.svg +12 -0
  130. package/src/icons/duotone-icons/Code/Lock-circle.svg +11 -0
  131. package/src/icons/duotone-icons/Code/Lock-overturning.svg +11 -0
  132. package/src/icons/duotone-icons/Code/Minus.svg +11 -0
  133. package/src/icons/duotone-icons/Code/Option.svg +11 -0
  134. package/src/icons/duotone-icons/Code/Plus.svg +11 -0
  135. package/src/icons/duotone-icons/Code/Puzzle.svg +10 -0
  136. package/src/icons/duotone-icons/Code/Question-circle.svg +11 -0
  137. package/src/icons/duotone-icons/Code/Right-circle.svg +11 -0
  138. package/src/icons/duotone-icons/Code/Settings#4.svg +11 -0
  139. package/src/icons/duotone-icons/Code/Shift.svg +10 -0
  140. package/src/icons/duotone-icons/Code/Spy.svg +11 -0
  141. package/src/icons/duotone-icons/Code/Stop.svg +10 -0
  142. package/src/icons/duotone-icons/Code/Terminal.svg +11 -0
  143. package/src/icons/duotone-icons/Code/Thunder-circle.svg +11 -0
  144. package/src/icons/duotone-icons/Code/Time-schedule.svg +11 -0
  145. package/src/icons/duotone-icons/Code/Warning-1-circle.svg +12 -0
  146. package/src/icons/duotone-icons/Code/Warning-2.svg +12 -0
  147. package/src/icons/duotone-icons/Communication/Active-call.svg +11 -0
  148. package/src/icons/duotone-icons/Communication/Add-user.svg +11 -0
  149. package/src/icons/duotone-icons/Communication/Address-card.svg +10 -0
  150. package/src/icons/duotone-icons/Communication/Adress-book#1.svg +11 -0
  151. package/src/icons/duotone-icons/Communication/Adress-book#2.svg +11 -0
  152. package/src/icons/duotone-icons/Communication/Archive.svg +10 -0
  153. package/src/icons/duotone-icons/Communication/Call#1.svg +10 -0
  154. package/src/icons/duotone-icons/Communication/Call.svg +10 -0
  155. package/src/icons/duotone-icons/Communication/Chat#1.svg +11 -0
  156. package/src/icons/duotone-icons/Communication/Chat#2.svg +11 -0
  157. package/src/icons/duotone-icons/Communication/Chat#4.svg +10 -0
  158. package/src/icons/duotone-icons/Communication/Chat#5.svg +11 -0
  159. package/src/icons/duotone-icons/Communication/Chat#6.svg +11 -0
  160. package/src/icons/duotone-icons/Communication/Chat-check.svg +11 -0
  161. package/src/icons/duotone-icons/Communication/Chat-error.svg +11 -0
  162. package/src/icons/duotone-icons/Communication/Chat-locked.svg +11 -0
  163. package/src/icons/duotone-icons/Communication/Chat-smile.svg +11 -0
  164. package/src/icons/duotone-icons/Communication/Clipboard-check.svg +12 -0
  165. package/src/icons/duotone-icons/Communication/Clipboard-list.svg +17 -0
  166. package/src/icons/duotone-icons/Communication/Contact#1.svg +11 -0
  167. package/src/icons/duotone-icons/Communication/Delete-user.svg +11 -0
  168. package/src/icons/duotone-icons/Communication/Dial-numbers.svg +18 -0
  169. package/src/icons/duotone-icons/Communication/Flag.svg +11 -0
  170. package/src/icons/duotone-icons/Communication/Forward.svg +10 -0
  171. package/src/icons/duotone-icons/Communication/Group-chat.svg +11 -0
  172. package/src/icons/duotone-icons/Communication/Group.svg +11 -0
  173. package/src/icons/duotone-icons/Communication/Incoming-box.svg +12 -0
  174. package/src/icons/duotone-icons/Communication/Incoming-call.svg +11 -0
  175. package/src/icons/duotone-icons/Communication/Incoming-mail.svg +11 -0
  176. package/src/icons/duotone-icons/Communication/Mail-@.svg +10 -0
  177. package/src/icons/duotone-icons/Communication/Mail-attachment.svg +11 -0
  178. package/src/icons/duotone-icons/Communication/Mail-box.svg +11 -0
  179. package/src/icons/duotone-icons/Communication/Mail-error.svg +11 -0
  180. package/src/icons/duotone-icons/Communication/Mail-heart.svg +11 -0
  181. package/src/icons/duotone-icons/Communication/Mail-locked.svg +11 -0
  182. package/src/icons/duotone-icons/Communication/Mail-notification.svg +11 -0
  183. package/src/icons/duotone-icons/Communication/Mail-opened.svg +11 -0
  184. package/src/icons/duotone-icons/Communication/Mail-unocked.svg +11 -0
  185. package/src/icons/duotone-icons/Communication/Mail.svg +10 -0
  186. package/src/icons/duotone-icons/Communication/Missed-call.svg +11 -0
  187. package/src/icons/duotone-icons/Communication/Outgoing-box.svg +12 -0
  188. package/src/icons/duotone-icons/Communication/Outgoing-call.svg +11 -0
  189. package/src/icons/duotone-icons/Communication/Outgoing-mail.svg +11 -0
  190. package/src/icons/duotone-icons/Communication/RSS.svg +12 -0
  191. package/src/icons/duotone-icons/Communication/Readed-mail.svg +11 -0
  192. package/src/icons/duotone-icons/Communication/Reply-all.svg +11 -0
  193. package/src/icons/duotone-icons/Communication/Reply.svg +10 -0
  194. package/src/icons/duotone-icons/Communication/Right.svg +10 -0
  195. package/src/icons/duotone-icons/Communication/Safe-chat.svg +11 -0
  196. package/src/icons/duotone-icons/Communication/Send.svg +10 -0
  197. package/src/icons/duotone-icons/Communication/Sending mail.svg +11 -0
  198. package/src/icons/duotone-icons/Communication/Sending.svg +11 -0
  199. package/src/icons/duotone-icons/Communication/Share.svg +11 -0
  200. package/src/icons/duotone-icons/Communication/Shield-thunder.svg +11 -0
  201. package/src/icons/duotone-icons/Communication/Shield-user.svg +12 -0
  202. package/src/icons/duotone-icons/Communication/Snoozed-mail.svg +11 -0
  203. package/src/icons/duotone-icons/Communication/Spam.svg +10 -0
  204. package/src/icons/duotone-icons/Communication/Thumbtack.svg +11 -0
  205. package/src/icons/duotone-icons/Communication/Urgent-mail.svg +11 -0
  206. package/src/icons/duotone-icons/Communication/Write.svg +11 -0
  207. package/src/icons/duotone-icons/Cooking/Baking-glove.svg +11 -0
  208. package/src/icons/duotone-icons/Cooking/Bowl.svg +11 -0
  209. package/src/icons/duotone-icons/Cooking/Chef.svg +11 -0
  210. package/src/icons/duotone-icons/Cooking/Cooking-book.svg +17 -0
  211. package/src/icons/duotone-icons/Cooking/Cooking-pot.svg +11 -0
  212. package/src/icons/duotone-icons/Cooking/Cutting board.svg +11 -0
  213. package/src/icons/duotone-icons/Cooking/Dinner.svg +14 -0
  214. package/src/icons/duotone-icons/Cooking/Dish.svg +11 -0
  215. package/src/icons/duotone-icons/Cooking/Dishes.svg +11 -0
  216. package/src/icons/duotone-icons/Cooking/Fork-spoon-knife.svg +15 -0
  217. package/src/icons/duotone-icons/Cooking/Fork-spoon.svg +13 -0
  218. package/src/icons/duotone-icons/Cooking/Fork.svg +11 -0
  219. package/src/icons/duotone-icons/Cooking/Frying-pan.svg +11 -0
  220. package/src/icons/duotone-icons/Cooking/Grater.svg +11 -0
  221. package/src/icons/duotone-icons/Cooking/Kitchen-scale.svg +11 -0
  222. package/src/icons/duotone-icons/Cooking/Knife#1.svg +11 -0
  223. package/src/icons/duotone-icons/Cooking/Knife#2.svg +11 -0
  224. package/src/icons/duotone-icons/Cooking/Knife&fork#1.svg +13 -0
  225. package/src/icons/duotone-icons/Cooking/Knife&fork#2.svg +13 -0
  226. package/src/icons/duotone-icons/Cooking/Ladle.svg +11 -0
  227. package/src/icons/duotone-icons/Cooking/Rolling-pin.svg +11 -0
  228. package/src/icons/duotone-icons/Cooking/Saucepan.svg +11 -0
  229. package/src/icons/duotone-icons/Cooking/Shovel.svg +11 -0
  230. package/src/icons/duotone-icons/Cooking/Sieve.svg +11 -0
  231. package/src/icons/duotone-icons/Cooking/Spoon.svg +12 -0
  232. package/src/icons/duotone-icons/Design/Adjust.svg +10 -0
  233. package/src/icons/duotone-icons/Design/Anchor-center-down.svg +14 -0
  234. package/src/icons/duotone-icons/Design/Anchor-center-up.svg +14 -0
  235. package/src/icons/duotone-icons/Design/Anchor-center.svg +11 -0
  236. package/src/icons/duotone-icons/Design/Anchor-left-down.svg +14 -0
  237. package/src/icons/duotone-icons/Design/Anchor-left-up.svg +14 -0
  238. package/src/icons/duotone-icons/Design/Anchor-left.svg +14 -0
  239. package/src/icons/duotone-icons/Design/Anchor-right-down.svg +14 -0
  240. package/src/icons/duotone-icons/Design/Anchor-right-up.svg +14 -0
  241. package/src/icons/duotone-icons/Design/Anchor-right.svg +14 -0
  242. package/src/icons/duotone-icons/Design/Arrows.svg +11 -0
  243. package/src/icons/duotone-icons/Design/Bezier-curve.svg +11 -0
  244. package/src/icons/duotone-icons/Design/Border.svg +10 -0
  245. package/src/icons/duotone-icons/Design/Brush.svg +11 -0
  246. package/src/icons/duotone-icons/Design/Bucket.svg +11 -0
  247. package/src/icons/duotone-icons/Design/Cap-1.svg +11 -0
  248. package/src/icons/duotone-icons/Design/Cap-2.svg +10 -0
  249. package/src/icons/duotone-icons/Design/Cap-3.svg +11 -0
  250. package/src/icons/duotone-icons/Design/Circle.svg +10 -0
  251. package/src/icons/duotone-icons/Design/Color-profile.svg +11 -0
  252. package/src/icons/duotone-icons/Design/Color.svg +10 -0
  253. package/src/icons/duotone-icons/Design/Component.svg +10 -0
  254. package/src/icons/duotone-icons/Design/Crop.svg +11 -0
  255. package/src/icons/duotone-icons/Design/Difference.svg +11 -0
  256. package/src/icons/duotone-icons/Design/Edit.svg +11 -0
  257. package/src/icons/duotone-icons/Design/Eraser.svg +10 -0
  258. package/src/icons/duotone-icons/Design/Flatten.svg +11 -0
  259. package/src/icons/duotone-icons/Design/Flip-horizontal.svg +12 -0
  260. package/src/icons/duotone-icons/Design/Flip-vertical.svg +12 -0
  261. package/src/icons/duotone-icons/Design/Horizontal.svg +11 -0
  262. package/src/icons/duotone-icons/Design/Image.svg +10 -0
  263. package/src/icons/duotone-icons/Design/Interselect.svg +11 -0
  264. package/src/icons/duotone-icons/Design/Join-1.svg +11 -0
  265. package/src/icons/duotone-icons/Design/Join-2.svg +11 -0
  266. package/src/icons/duotone-icons/Design/Join-3.svg +11 -0
  267. package/src/icons/duotone-icons/Design/Layers.svg +11 -0
  268. package/src/icons/duotone-icons/Design/Line.svg +12 -0
  269. package/src/icons/duotone-icons/Design/Magic.svg +11 -0
  270. package/src/icons/duotone-icons/Design/Mask.svg +11 -0
  271. package/src/icons/duotone-icons/Design/Patch.svg +12 -0
  272. package/src/icons/duotone-icons/Design/Pen&ruller.svg +11 -0
  273. package/src/icons/duotone-icons/Design/Pen-tool-vector.svg +11 -0
  274. package/src/icons/duotone-icons/Design/Pencil.svg +11 -0
  275. package/src/icons/duotone-icons/Design/Picker.svg +11 -0
  276. package/src/icons/duotone-icons/Design/Pixels.svg +15 -0
  277. package/src/icons/duotone-icons/Design/Polygon.svg +10 -0
  278. package/src/icons/duotone-icons/Design/Position.svg +10 -0
  279. package/src/icons/duotone-icons/Design/Rectangle.svg +10 -0
  280. package/src/icons/duotone-icons/Design/Saturation.svg +11 -0
  281. package/src/icons/duotone-icons/Design/Select.svg +11 -0
  282. package/src/icons/duotone-icons/Design/Sketch.svg +11 -0
  283. package/src/icons/duotone-icons/Design/Stamp.svg +11 -0
  284. package/src/icons/duotone-icons/Design/Substract.svg +11 -0
  285. package/src/icons/duotone-icons/Design/Target.svg +11 -0
  286. package/src/icons/duotone-icons/Design/Triangle.svg +10 -0
  287. package/src/icons/duotone-icons/Design/Union.svg +10 -0
  288. package/src/icons/duotone-icons/Design/Vertical.svg +11 -0
  289. package/src/icons/duotone-icons/Design/Zoom minus.svg +12 -0
  290. package/src/icons/duotone-icons/Design/Zoom plus.svg +12 -0
  291. package/src/icons/duotone-icons/Devices/Airpods.svg +13 -0
  292. package/src/icons/duotone-icons/Devices/Android.svg +11 -0
  293. package/src/icons/duotone-icons/Devices/Apple-Watch.svg +11 -0
  294. package/src/icons/duotone-icons/Devices/Battery-charging.svg +12 -0
  295. package/src/icons/duotone-icons/Devices/Battery-empty.svg +11 -0
  296. package/src/icons/duotone-icons/Devices/Battery-full.svg +11 -0
  297. package/src/icons/duotone-icons/Devices/Battery-half.svg +11 -0
  298. package/src/icons/duotone-icons/Devices/Bluetooth.svg +11 -0
  299. package/src/icons/duotone-icons/Devices/CPU#1.svg +17 -0
  300. package/src/icons/duotone-icons/Devices/CPU#2.svg +23 -0
  301. package/src/icons/duotone-icons/Devices/Camera.svg +12 -0
  302. package/src/icons/duotone-icons/Devices/Cardboard-vr.svg +11 -0
  303. package/src/icons/duotone-icons/Devices/Cassete.svg +12 -0
  304. package/src/icons/duotone-icons/Devices/Diagnostics.svg +12 -0
  305. package/src/icons/duotone-icons/Devices/Display#1.svg +11 -0
  306. package/src/icons/duotone-icons/Devices/Display#2.svg +12 -0
  307. package/src/icons/duotone-icons/Devices/Display#3.svg +12 -0
  308. package/src/icons/duotone-icons/Devices/Gameboy.svg +11 -0
  309. package/src/icons/duotone-icons/Devices/Gamepad#1.svg +11 -0
  310. package/src/icons/duotone-icons/Devices/Gamepad#2.svg +11 -0
  311. package/src/icons/duotone-icons/Devices/Generator.svg +13 -0
  312. package/src/icons/duotone-icons/Devices/Hard-drive.svg +11 -0
  313. package/src/icons/duotone-icons/Devices/Headphones.svg +11 -0
  314. package/src/icons/duotone-icons/Devices/Homepod.svg +11 -0
  315. package/src/icons/duotone-icons/Devices/Keyboard.svg +11 -0
  316. package/src/icons/duotone-icons/Devices/LTE#1.svg +11 -0
  317. package/src/icons/duotone-icons/Devices/LTE#2.svg +11 -0
  318. package/src/icons/duotone-icons/Devices/Laptop-macbook.svg +11 -0
  319. package/src/icons/duotone-icons/Devices/Laptop.svg +11 -0
  320. package/src/icons/duotone-icons/Devices/Mic.svg +11 -0
  321. package/src/icons/duotone-icons/Devices/Midi.svg +16 -0
  322. package/src/icons/duotone-icons/Devices/Mouse.svg +12 -0
  323. package/src/icons/duotone-icons/Devices/Phone.svg +12 -0
  324. package/src/icons/duotone-icons/Devices/Printer.svg +11 -0
  325. package/src/icons/duotone-icons/Devices/Radio.svg +14 -0
  326. package/src/icons/duotone-icons/Devices/Router#1.svg +11 -0
  327. package/src/icons/duotone-icons/Devices/Router#2.svg +11 -0
  328. package/src/icons/duotone-icons/Devices/SD-card.svg +10 -0
  329. package/src/icons/duotone-icons/Devices/Server.svg +12 -0
  330. package/src/icons/duotone-icons/Devices/Speaker.svg +11 -0
  331. package/src/icons/duotone-icons/Devices/TV#1.svg +12 -0
  332. package/src/icons/duotone-icons/Devices/TV#2.svg +11 -0
  333. package/src/icons/duotone-icons/Devices/Tablet.svg +11 -0
  334. package/src/icons/duotone-icons/Devices/USB.svg +12 -0
  335. package/src/icons/duotone-icons/Devices/Usb-storage.svg +11 -0
  336. package/src/icons/duotone-icons/Devices/Video-camera.svg +11 -0
  337. package/src/icons/duotone-icons/Devices/Watch#1.svg +13 -0
  338. package/src/icons/duotone-icons/Devices/Watch#2.svg +13 -0
  339. package/src/icons/duotone-icons/Devices/Wi-fi.svg +11 -0
  340. package/src/icons/duotone-icons/Devices/iMac.svg +12 -0
  341. package/src/icons/duotone-icons/Devices/iPhone-X.svg +11 -0
  342. package/src/icons/duotone-icons/Devices/iPhone-back.svg +10 -0
  343. package/src/icons/duotone-icons/Devices/iPhone-x-back.svg +10 -0
  344. package/src/icons/duotone-icons/Electric/Air-conditioning.svg +11 -0
  345. package/src/icons/duotone-icons/Electric/Blender.svg +10 -0
  346. package/src/icons/duotone-icons/Electric/Fan.svg +12 -0
  347. package/src/icons/duotone-icons/Electric/Fridge.svg +10 -0
  348. package/src/icons/duotone-icons/Electric/Gas-stove.svg +11 -0
  349. package/src/icons/duotone-icons/Electric/Hair-dryer.svg +11 -0
  350. package/src/icons/duotone-icons/Electric/Highvoltage.svg +10 -0
  351. package/src/icons/duotone-icons/Electric/Iron.svg +11 -0
  352. package/src/icons/duotone-icons/Electric/Kettle.svg +11 -0
  353. package/src/icons/duotone-icons/Electric/Mixer.svg +11 -0
  354. package/src/icons/duotone-icons/Electric/Outlet.svg +11 -0
  355. package/src/icons/duotone-icons/Electric/Range-hood.svg +11 -0
  356. package/src/icons/duotone-icons/Electric/Shutdown.svg +11 -0
  357. package/src/icons/duotone-icons/Electric/Socket-eu.svg +10 -0
  358. package/src/icons/duotone-icons/Electric/Socket-us.svg +10 -0
  359. package/src/icons/duotone-icons/Electric/Washer.svg +11 -0
  360. package/src/icons/duotone-icons/Files/Cloud-download.svg +11 -0
  361. package/src/icons/duotone-icons/Files/Cloud-upload.svg +11 -0
  362. package/src/icons/duotone-icons/Files/Compilation.svg +14 -0
  363. package/src/icons/duotone-icons/Files/Compiled-file.svg +14 -0
  364. package/src/icons/duotone-icons/Files/Deleted-file.svg +11 -0
  365. package/src/icons/duotone-icons/Files/Deleted-folder.svg +11 -0
  366. package/src/icons/duotone-icons/Files/Download.inline.svg +12 -0
  367. package/src/icons/duotone-icons/Files/Downloaded file.svg +11 -0
  368. package/src/icons/duotone-icons/Files/Downloads-folder.svg +11 -0
  369. package/src/icons/duotone-icons/Files/Export.svg +12 -0
  370. package/src/icons/duotone-icons/Files/File-cloud.svg +11 -0
  371. package/src/icons/duotone-icons/Files/File-done.svg +11 -0
  372. package/src/icons/duotone-icons/Files/File-minus.svg +11 -0
  373. package/src/icons/duotone-icons/Files/File-plus.svg +11 -0
  374. package/src/icons/duotone-icons/Files/File.svg +12 -0
  375. package/src/icons/duotone-icons/Files/Folder-check.svg +11 -0
  376. package/src/icons/duotone-icons/Files/Folder-cloud.svg +11 -0
  377. package/src/icons/duotone-icons/Files/Folder-error.svg +11 -0
  378. package/src/icons/duotone-icons/Files/Folder-heart.svg +11 -0
  379. package/src/icons/duotone-icons/Files/Folder-minus.svg +11 -0
  380. package/src/icons/duotone-icons/Files/Folder-plus.svg +11 -0
  381. package/src/icons/duotone-icons/Files/Folder-solid.svg +10 -0
  382. package/src/icons/duotone-icons/Files/Folder-star.svg +11 -0
  383. package/src/icons/duotone-icons/Files/Folder-thunder.svg +11 -0
  384. package/src/icons/duotone-icons/Files/Folder.svg +10 -0
  385. package/src/icons/duotone-icons/Files/Group-folders.svg +11 -0
  386. package/src/icons/duotone-icons/Files/Import.svg +12 -0
  387. package/src/icons/duotone-icons/Files/Locked-folder.svg +11 -0
  388. package/src/icons/duotone-icons/Files/Media-folder.svg +11 -0
  389. package/src/icons/duotone-icons/Files/Media.svg +11 -0
  390. package/src/icons/duotone-icons/Files/Music.svg +11 -0
  391. package/src/icons/duotone-icons/Files/Pictures#1.svg +13 -0
  392. package/src/icons/duotone-icons/Files/Pictures#2.svg +15 -0
  393. package/src/icons/duotone-icons/Files/Protected-file.svg +11 -0
  394. package/src/icons/duotone-icons/Files/Selected-file.svg +11 -0
  395. package/src/icons/duotone-icons/Files/Share.svg +13 -0
  396. package/src/icons/duotone-icons/Files/Upload-folder.svg +11 -0
  397. package/src/icons/duotone-icons/Files/Upload.svg +12 -0
  398. package/src/icons/duotone-icons/Files/Uploaded-file.svg +11 -0
  399. package/src/icons/duotone-icons/Files/User-folder.svg +12 -0
  400. package/src/icons/duotone-icons/Food/Beer.svg +14 -0
  401. package/src/icons/duotone-icons/Food/Bottle#1.svg +11 -0
  402. package/src/icons/duotone-icons/Food/Bottle#2.svg +11 -0
  403. package/src/icons/duotone-icons/Food/Bread.svg +11 -0
  404. package/src/icons/duotone-icons/Food/Bucket.svg +11 -0
  405. package/src/icons/duotone-icons/Food/Burger.svg +12 -0
  406. package/src/icons/duotone-icons/Food/Cake.svg +12 -0
  407. package/src/icons/duotone-icons/Food/Carrot.svg +13 -0
  408. package/src/icons/duotone-icons/Food/Cheese.svg +11 -0
  409. package/src/icons/duotone-icons/Food/Chicken.svg +13 -0
  410. package/src/icons/duotone-icons/Food/Coffee#1.svg +14 -0
  411. package/src/icons/duotone-icons/Food/Coffee#2.svg +12 -0
  412. package/src/icons/duotone-icons/Food/Cookie.svg +13 -0
  413. package/src/icons/duotone-icons/Food/Dinner.svg +11 -0
  414. package/src/icons/duotone-icons/Food/Fish.svg +11 -0
  415. package/src/icons/duotone-icons/Food/French Bread.svg +10 -0
  416. package/src/icons/duotone-icons/Food/Glass-martini.svg +11 -0
  417. package/src/icons/duotone-icons/Food/Ice-cream#1.svg +11 -0
  418. package/src/icons/duotone-icons/Food/Ice-cream#2.svg +11 -0
  419. package/src/icons/duotone-icons/Food/Miso-soup.svg +11 -0
  420. package/src/icons/duotone-icons/Food/Orange.svg +11 -0
  421. package/src/icons/duotone-icons/Food/Pizza.svg +13 -0
  422. package/src/icons/duotone-icons/Food/Sushi.svg +11 -0
  423. package/src/icons/duotone-icons/Food/Two-bottles.svg +11 -0
  424. package/src/icons/duotone-icons/Food/Wine.svg +11 -0
  425. package/src/icons/duotone-icons/General/Attachment#1.svg +11 -0
  426. package/src/icons/duotone-icons/General/Attachment#2.svg +13 -0
  427. package/src/icons/duotone-icons/General/Binocular.svg +10 -0
  428. package/src/icons/duotone-icons/General/Bookmark.svg +10 -0
  429. package/src/icons/duotone-icons/General/Clip.svg +10 -0
  430. package/src/icons/duotone-icons/General/Clipboard.svg +13 -0
  431. package/src/icons/duotone-icons/General/Cursor.svg +10 -0
  432. package/src/icons/duotone-icons/General/Dislike.svg +11 -0
  433. package/src/icons/duotone-icons/General/Duplicate.svg +11 -0
  434. package/src/icons/duotone-icons/General/Edit.svg +10 -0
  435. package/src/icons/duotone-icons/General/Expand-arrows.svg +11 -0
  436. package/src/icons/duotone-icons/General/Fire.svg +10 -0
  437. package/src/icons/duotone-icons/General/Folder.svg +10 -0
  438. package/src/icons/duotone-icons/General/Half-heart.svg +11 -0
  439. package/src/icons/duotone-icons/General/Half-star.svg +11 -0
  440. package/src/icons/duotone-icons/General/Heart.svg +10 -0
  441. package/src/icons/duotone-icons/General/Hidden.svg +12 -0
  442. package/src/icons/duotone-icons/General/Like.svg +11 -0
  443. package/src/icons/duotone-icons/General/Lock.svg +16 -0
  444. package/src/icons/duotone-icons/General/Notification#2.svg +11 -0
  445. package/src/icons/duotone-icons/General/Notifications#1.svg +10 -0
  446. package/src/icons/duotone-icons/General/Other#1.svg +12 -0
  447. package/src/icons/duotone-icons/General/Other#2.svg +12 -0
  448. package/src/icons/duotone-icons/General/Sad.svg +11 -0
  449. package/src/icons/duotone-icons/General/Save.svg +11 -0
  450. package/src/icons/duotone-icons/General/Scale.svg +11 -0
  451. package/src/icons/duotone-icons/General/Scissors.svg +11 -0
  452. package/src/icons/duotone-icons/General/Search.svg +11 -0
  453. package/src/icons/duotone-icons/General/Settings#3.svg +11 -0
  454. package/src/icons/duotone-icons/General/Settings-1.inline.svg +11 -0
  455. package/src/icons/duotone-icons/General/Settings-2.svg +10 -0
  456. package/src/icons/duotone-icons/General/Shield-check.svg +11 -0
  457. package/src/icons/duotone-icons/General/Shield-disabled.svg +11 -0
  458. package/src/icons/duotone-icons/General/Shield-protected.svg +11 -0
  459. package/src/icons/duotone-icons/General/Size.svg +11 -0
  460. package/src/icons/duotone-icons/General/Smile.svg +11 -0
  461. package/src/icons/duotone-icons/General/Star.svg +10 -0
  462. package/src/icons/duotone-icons/General/Thunder-move.svg +11 -0
  463. package/src/icons/duotone-icons/General/Thunder.svg +10 -0
  464. package/src/icons/duotone-icons/General/Trash.svg +11 -0
  465. package/src/icons/duotone-icons/General/Unlock.svg +16 -0
  466. package/src/icons/duotone-icons/General/Update.svg +10 -0
  467. package/src/icons/duotone-icons/General/User.svg +11 -0
  468. package/src/icons/duotone-icons/General/Visible.svg +11 -0
  469. package/src/icons/duotone-icons/Home/Air-ballon.svg +11 -0
  470. package/src/icons/duotone-icons/Home/Alarm-clock.svg +12 -0
  471. package/src/icons/duotone-icons/Home/Armchair.svg +11 -0
  472. package/src/icons/duotone-icons/Home/Bag-chair.svg +11 -0
  473. package/src/icons/duotone-icons/Home/Bath.svg +11 -0
  474. package/src/icons/duotone-icons/Home/Bed.svg +12 -0
  475. package/src/icons/duotone-icons/Home/Book-open.svg +11 -0
  476. package/src/icons/duotone-icons/Home/Book.svg +16 -0
  477. package/src/icons/duotone-icons/Home/Box.svg +11 -0
  478. package/src/icons/duotone-icons/Home/Broom.svg +11 -0
  479. package/src/icons/duotone-icons/Home/Building.svg +12 -0
  480. package/src/icons/duotone-icons/Home/Bulb#1.svg +13 -0
  481. package/src/icons/duotone-icons/Home/Bulb#2.svg +13 -0
  482. package/src/icons/duotone-icons/Home/Chair#1.svg +11 -0
  483. package/src/icons/duotone-icons/Home/Chair#2.svg +11 -0
  484. package/src/icons/duotone-icons/Home/Clock.svg +11 -0
  485. package/src/icons/duotone-icons/Home/Commode#1.svg +11 -0
  486. package/src/icons/duotone-icons/Home/Commode#2.svg +11 -0
  487. package/src/icons/duotone-icons/Home/Couch.svg +11 -0
  488. package/src/icons/duotone-icons/Home/Cupboard.svg +11 -0
  489. package/src/icons/duotone-icons/Home/Curtains.svg +11 -0
  490. package/src/icons/duotone-icons/Home/Deer.svg +11 -0
  491. package/src/icons/duotone-icons/Home/Door-open.svg +11 -0
  492. package/src/icons/duotone-icons/Home/Earth.svg +11 -0
  493. package/src/icons/duotone-icons/Home/Fireplace.svg +11 -0
  494. package/src/icons/duotone-icons/Home/Flashlight.svg +11 -0
  495. package/src/icons/duotone-icons/Home/Flower#1.svg +13 -0
  496. package/src/icons/duotone-icons/Home/Flower#2.svg +14 -0
  497. package/src/icons/duotone-icons/Home/Flower#3.svg +12 -0
  498. package/src/icons/duotone-icons/Home/Globe.svg +11 -0
  499. package/src/icons/duotone-icons/Home/Home-heart.svg +11 -0
  500. package/src/icons/duotone-icons/Home/Home.svg +10 -0
  501. package/src/icons/duotone-icons/Home/Key.svg +11 -0
  502. package/src/icons/duotone-icons/Home/Ladder.svg +11 -0
  503. package/src/icons/duotone-icons/Home/Lamp#1.svg +13 -0
  504. package/src/icons/duotone-icons/Home/Lamp#2.svg +12 -0
  505. package/src/icons/duotone-icons/Home/Library.svg +11 -0
  506. package/src/icons/duotone-icons/Home/Mailbox.svg +11 -0
  507. package/src/icons/duotone-icons/Home/Mirror.svg +11 -0
  508. package/src/icons/duotone-icons/Home/Picture.svg +13 -0
  509. package/src/icons/duotone-icons/Home/Ruller.svg +10 -0
  510. package/src/icons/duotone-icons/Home/Stairs.svg +10 -0
  511. package/src/icons/duotone-icons/Home/Timer.svg +13 -0
  512. package/src/icons/duotone-icons/Home/Toilet.svg +11 -0
  513. package/src/icons/duotone-icons/Home/Towel.svg +10 -0
  514. package/src/icons/duotone-icons/Home/Trash.svg +11 -0
  515. package/src/icons/duotone-icons/Home/Water-mixer.svg +12 -0
  516. package/src/icons/duotone-icons/Home/Weight#1.svg +11 -0
  517. package/src/icons/duotone-icons/Home/Weight#2.svg +11 -0
  518. package/src/icons/duotone-icons/Home/Wood#1.svg +11 -0
  519. package/src/icons/duotone-icons/Home/Wood#2.svg +11 -0
  520. package/src/icons/duotone-icons/Home/Wood-horse.svg +10 -0
  521. package/src/icons/duotone-icons/Layout/Layout-3d.svg +11 -0
  522. package/src/icons/duotone-icons/Layout/Layout-4-blocks.svg +11 -0
  523. package/src/icons/duotone-icons/Layout/Layout-arrange.inline.svg +11 -0
  524. package/src/icons/duotone-icons/Layout/Layout-grid.svg +11 -0
  525. package/src/icons/duotone-icons/Layout/Layout-horizontal.svg +11 -0
  526. package/src/icons/duotone-icons/Layout/Layout-left-panel-1.svg +11 -0
  527. package/src/icons/duotone-icons/Layout/Layout-left-panel-2.svg +11 -0
  528. package/src/icons/duotone-icons/Layout/Layout-right-panel-1.svg +11 -0
  529. package/src/icons/duotone-icons/Layout/Layout-right-panel-2.svg +11 -0
  530. package/src/icons/duotone-icons/Layout/Layout-top-panel-1.svg +11 -0
  531. package/src/icons/duotone-icons/Layout/Layout-top-panel-2.svg +11 -0
  532. package/src/icons/duotone-icons/Layout/Layout-top-panel-3.svg +11 -0
  533. package/src/icons/duotone-icons/Layout/Layout-top-panel-4.svg +11 -0
  534. package/src/icons/duotone-icons/Layout/Layout-top-panel-5.svg +11 -0
  535. package/src/icons/duotone-icons/Layout/Layout-top-panel-6.svg +11 -0
  536. package/src/icons/duotone-icons/Layout/Layout-vertical.svg +11 -0
  537. package/src/icons/duotone-icons/Map/Compass.svg +10 -0
  538. package/src/icons/duotone-icons/Map/Direction#1.svg +10 -0
  539. package/src/icons/duotone-icons/Map/Direction#2.svg +10 -0
  540. package/src/icons/duotone-icons/Map/Location-arrow.svg +10 -0
  541. package/src/icons/duotone-icons/Map/Marker#1.svg +10 -0
  542. package/src/icons/duotone-icons/Map/Marker#2.svg +10 -0
  543. package/src/icons/duotone-icons/Map/Position.svg +12 -0
  544. package/src/icons/duotone-icons/Media/Add-music.svg +11 -0
  545. package/src/icons/duotone-icons/Media/Airplay-video.svg +11 -0
  546. package/src/icons/duotone-icons/Media/Airplay.svg +11 -0
  547. package/src/icons/duotone-icons/Media/Back.svg +11 -0
  548. package/src/icons/duotone-icons/Media/Backward.svg +11 -0
  549. package/src/icons/duotone-icons/Media/CD.svg +11 -0
  550. package/src/icons/duotone-icons/Media/DVD.svg +11 -0
  551. package/src/icons/duotone-icons/Media/Eject.svg +11 -0
  552. package/src/icons/duotone-icons/Media/Equalizer.svg +13 -0
  553. package/src/icons/duotone-icons/Media/Forward.svg +11 -0
  554. package/src/icons/duotone-icons/Media/Media-library#1.svg +13 -0
  555. package/src/icons/duotone-icons/Media/Media-library#2.svg +11 -0
  556. package/src/icons/duotone-icons/Media/Media-library#3.svg +17 -0
  557. package/src/icons/duotone-icons/Media/Movie-Lane #2.svg +11 -0
  558. package/src/icons/duotone-icons/Media/Movie-lane#1.svg +11 -0
  559. package/src/icons/duotone-icons/Media/Music-cloud.svg +11 -0
  560. package/src/icons/duotone-icons/Media/Music-note.svg +10 -0
  561. package/src/icons/duotone-icons/Media/Music.svg +10 -0
  562. package/src/icons/duotone-icons/Media/Mute.svg +11 -0
  563. package/src/icons/duotone-icons/Media/Next.svg +11 -0
  564. package/src/icons/duotone-icons/Media/Pause.svg +10 -0
  565. package/src/icons/duotone-icons/Media/Play.svg +10 -0
  566. package/src/icons/duotone-icons/Media/Playlist#1.svg +11 -0
  567. package/src/icons/duotone-icons/Media/Playlist#2.svg +11 -0
  568. package/src/icons/duotone-icons/Media/Rec.svg +10 -0
  569. package/src/icons/duotone-icons/Media/Repeat-one.svg +11 -0
  570. package/src/icons/duotone-icons/Media/Repeat.svg +11 -0
  571. package/src/icons/duotone-icons/Media/Shuffle.svg +11 -0
  572. package/src/icons/duotone-icons/Media/Volume-down.svg +11 -0
  573. package/src/icons/duotone-icons/Media/Volume-full.svg +11 -0
  574. package/src/icons/duotone-icons/Media/Volume-half.svg +11 -0
  575. package/src/icons/duotone-icons/Media/Volume-up.svg +11 -0
  576. package/src/icons/duotone-icons/Media/Vynil.svg +11 -0
  577. package/src/icons/duotone-icons/Media/Youtube.svg +11 -0
  578. package/src/icons/duotone-icons/Navigation/Angle-double-down.svg +11 -0
  579. package/src/icons/duotone-icons/Navigation/Angle-double-left.svg +11 -0
  580. package/src/icons/duotone-icons/Navigation/Angle-double-right.svg +11 -0
  581. package/src/icons/duotone-icons/Navigation/Angle-double-up.svg +11 -0
  582. package/src/icons/duotone-icons/Navigation/Angle-down.svg +10 -0
  583. package/src/icons/duotone-icons/Navigation/Angle-left.svg +10 -0
  584. package/src/icons/duotone-icons/Navigation/Angle-right.svg +10 -0
  585. package/src/icons/duotone-icons/Navigation/Angle-up.svg +10 -0
  586. package/src/icons/duotone-icons/Navigation/Arrow-down.svg +11 -0
  587. package/src/icons/duotone-icons/Navigation/Arrow-from-bottom.svg +12 -0
  588. package/src/icons/duotone-icons/Navigation/Arrow-from-left.svg +12 -0
  589. package/src/icons/duotone-icons/Navigation/Arrow-from-right.svg +12 -0
  590. package/src/icons/duotone-icons/Navigation/Arrow-from-top.svg +12 -0
  591. package/src/icons/duotone-icons/Navigation/Arrow-left.svg +11 -0
  592. package/src/icons/duotone-icons/Navigation/Arrow-right.svg +11 -0
  593. package/src/icons/duotone-icons/Navigation/Arrow-to-bottom.svg +12 -0
  594. package/src/icons/duotone-icons/Navigation/Arrow-to-left.svg +12 -0
  595. package/src/icons/duotone-icons/Navigation/Arrow-to-right.svg +12 -0
  596. package/src/icons/duotone-icons/Navigation/Arrow-to-up.svg +12 -0
  597. package/src/icons/duotone-icons/Navigation/Arrow-up.svg +11 -0
  598. package/src/icons/duotone-icons/Navigation/Arrows-h.svg +12 -0
  599. package/src/icons/duotone-icons/Navigation/Arrows-v.svg +12 -0
  600. package/src/icons/duotone-icons/Navigation/Check.svg +10 -0
  601. package/src/icons/duotone-icons/Navigation/Close.svg +12 -0
  602. package/src/icons/duotone-icons/Navigation/Double-check.svg +11 -0
  603. package/src/icons/duotone-icons/Navigation/Down-2.svg +11 -0
  604. package/src/icons/duotone-icons/Navigation/Down-left.svg +11 -0
  605. package/src/icons/duotone-icons/Navigation/Down-right.svg +11 -0
  606. package/src/icons/duotone-icons/Navigation/Exchange.svg +13 -0
  607. package/src/icons/duotone-icons/Navigation/Left 3.svg +11 -0
  608. package/src/icons/duotone-icons/Navigation/Left-2.svg +11 -0
  609. package/src/icons/duotone-icons/Navigation/Minus.svg +9 -0
  610. package/src/icons/duotone-icons/Navigation/Plus.svg +10 -0
  611. package/src/icons/duotone-icons/Navigation/Right 3.svg +11 -0
  612. package/src/icons/duotone-icons/Navigation/Right-2.svg +11 -0
  613. package/src/icons/duotone-icons/Navigation/Route.svg +12 -0
  614. package/src/icons/duotone-icons/Navigation/Sign-in.svg +12 -0
  615. package/src/icons/duotone-icons/Navigation/Sign-out.svg +12 -0
  616. package/src/icons/duotone-icons/Navigation/Up-2.svg +11 -0
  617. package/src/icons/duotone-icons/Navigation/Up-down.svg +13 -0
  618. package/src/icons/duotone-icons/Navigation/Up-left.svg +11 -0
  619. package/src/icons/duotone-icons/Navigation/Up-right.svg +11 -0
  620. package/src/icons/duotone-icons/Navigation/Waiting.svg +10 -0
  621. package/src/icons/duotone-icons/Shopping/ATM.svg +11 -0
  622. package/src/icons/duotone-icons/Shopping/Bag#1.svg +11 -0
  623. package/src/icons/duotone-icons/Shopping/Bag#2.svg +11 -0
  624. package/src/icons/duotone-icons/Shopping/Barcode-read.svg +11 -0
  625. package/src/icons/duotone-icons/Shopping/Barcode-scan.svg +12 -0
  626. package/src/icons/duotone-icons/Shopping/Barcode.svg +11 -0
  627. package/src/icons/duotone-icons/Shopping/Bitcoin.svg +12 -0
  628. package/src/icons/duotone-icons/Shopping/Box#1.svg +11 -0
  629. package/src/icons/duotone-icons/Shopping/Box#3.svg +11 -0
  630. package/src/icons/duotone-icons/Shopping/Box2.inline.svg +11 -0
  631. package/src/icons/duotone-icons/Shopping/Calculator.svg +11 -0
  632. package/src/icons/duotone-icons/Shopping/Cart#1.svg +11 -0
  633. package/src/icons/duotone-icons/Shopping/Cart#2.svg +11 -0
  634. package/src/icons/duotone-icons/Shopping/Cart#3.svg +11 -0
  635. package/src/icons/duotone-icons/Shopping/Chart-bar#1.svg +13 -0
  636. package/src/icons/duotone-icons/Shopping/Chart-bar#2.svg +13 -0
  637. package/src/icons/duotone-icons/Shopping/Chart-bar#3.svg +13 -0
  638. package/src/icons/duotone-icons/Shopping/Chart-line#1.svg +11 -0
  639. package/src/icons/duotone-icons/Shopping/Chart-line#2.svg +11 -0
  640. package/src/icons/duotone-icons/Shopping/Chart-pie.svg +11 -0
  641. package/src/icons/duotone-icons/Shopping/Credit-card.svg +12 -0
  642. package/src/icons/duotone-icons/Shopping/Dollar.svg +12 -0
  643. package/src/icons/duotone-icons/Shopping/Euro.svg +11 -0
  644. package/src/icons/duotone-icons/Shopping/Gift.svg +11 -0
  645. package/src/icons/duotone-icons/Shopping/Loader.svg +12 -0
  646. package/src/icons/duotone-icons/Shopping/MC.svg +11 -0
  647. package/src/icons/duotone-icons/Shopping/Money.svg +11 -0
  648. package/src/icons/duotone-icons/Shopping/Pound.svg +11 -0
  649. package/src/icons/duotone-icons/Shopping/Price #1.svg +10 -0
  650. package/src/icons/duotone-icons/Shopping/Price #2.svg +14 -0
  651. package/src/icons/duotone-icons/Shopping/Rouble.svg +11 -0
  652. package/src/icons/duotone-icons/Shopping/Safe.svg +11 -0
  653. package/src/icons/duotone-icons/Shopping/Sale#1.svg +11 -0
  654. package/src/icons/duotone-icons/Shopping/Sale#2.svg +13 -0
  655. package/src/icons/duotone-icons/Shopping/Settings.svg +11 -0
  656. package/src/icons/duotone-icons/Shopping/Sort#1.svg +11 -0
  657. package/src/icons/duotone-icons/Shopping/Sort#2.svg +10 -0
  658. package/src/icons/duotone-icons/Shopping/Sort#3.svg +10 -0
  659. package/src/icons/duotone-icons/Shopping/Ticket.svg +10 -0
  660. package/src/icons/duotone-icons/Shopping/Wallet#2.svg +11 -0
  661. package/src/icons/duotone-icons/Shopping/Wallet#3.svg +12 -0
  662. package/src/icons/duotone-icons/Shopping/Wallet.svg +12 -0
  663. package/src/icons/duotone-icons/Text/Align-auto.svg +11 -0
  664. package/src/icons/duotone-icons/Text/Align-center.svg +11 -0
  665. package/src/icons/duotone-icons/Text/Align-justify.svg +11 -0
  666. package/src/icons/duotone-icons/Text/Align-left.svg +12 -0
  667. package/src/icons/duotone-icons/Text/Align-right.svg +11 -0
  668. package/src/icons/duotone-icons/Text/Article.svg +11 -0
  669. package/src/icons/duotone-icons/Text/Bold.svg +10 -0
  670. package/src/icons/duotone-icons/Text/Bullet-list.svg +11 -0
  671. package/src/icons/duotone-icons/Text/Code.svg +10 -0
  672. package/src/icons/duotone-icons/Text/Edit-text.svg +11 -0
  673. package/src/icons/duotone-icons/Text/Filter.svg +10 -0
  674. package/src/icons/duotone-icons/Text/Font.svg +11 -0
  675. package/src/icons/duotone-icons/Text/H1.svg +11 -0
  676. package/src/icons/duotone-icons/Text/H2.svg +11 -0
  677. package/src/icons/duotone-icons/Text/Itallic.svg +10 -0
  678. package/src/icons/duotone-icons/Text/Menu.svg +11 -0
  679. package/src/icons/duotone-icons/Text/Paragraph.svg +10 -0
  680. package/src/icons/duotone-icons/Text/Quote#1.svg +11 -0
  681. package/src/icons/duotone-icons/Text/Quote#2.svg +11 -0
  682. package/src/icons/duotone-icons/Text/Redo.svg +10 -0
  683. package/src/icons/duotone-icons/Text/Strikethrough.svg +11 -0
  684. package/src/icons/duotone-icons/Text/Text-height.svg +11 -0
  685. package/src/icons/duotone-icons/Text/Text-width.svg +11 -0
  686. package/src/icons/duotone-icons/Text/Text.svg +10 -0
  687. package/src/icons/duotone-icons/Text/Underline.svg +11 -0
  688. package/src/icons/duotone-icons/Text/Undo.svg +10 -0
  689. package/src/icons/duotone-icons/Tools/Angle Grinder.svg +12 -0
  690. package/src/icons/duotone-icons/Tools/Axe.svg +11 -0
  691. package/src/icons/duotone-icons/Tools/Brush.svg +11 -0
  692. package/src/icons/duotone-icons/Tools/Compass.svg +11 -0
  693. package/src/icons/duotone-icons/Tools/Hummer#2.svg +12 -0
  694. package/src/icons/duotone-icons/Tools/Hummer.svg +11 -0
  695. package/src/icons/duotone-icons/Tools/Pantone.svg +12 -0
  696. package/src/icons/duotone-icons/Tools/Road-Cone.svg +11 -0
  697. package/src/icons/duotone-icons/Tools/Roller.svg +12 -0
  698. package/src/icons/duotone-icons/Tools/Roulette.svg +11 -0
  699. package/src/icons/duotone-icons/Tools/Screwdriver.svg +11 -0
  700. package/src/icons/duotone-icons/Tools/Shovel.svg +11 -0
  701. package/src/icons/duotone-icons/Tools/Spatula.svg +11 -0
  702. package/src/icons/duotone-icons/Tools/Swiss-knife.svg +11 -0
  703. package/src/icons/duotone-icons/Tools/Tools.svg +11 -0
  704. package/src/icons/duotone-icons/Weather/Celcium.svg +11 -0
  705. package/src/icons/duotone-icons/Weather/Cloud#1.svg +10 -0
  706. package/src/icons/duotone-icons/Weather/Cloud#2.svg +11 -0
  707. package/src/icons/duotone-icons/Weather/Cloud-fog.svg +11 -0
  708. package/src/icons/duotone-icons/Weather/Cloud-sun.svg +11 -0
  709. package/src/icons/duotone-icons/Weather/Cloud-wind.svg +12 -0
  710. package/src/icons/duotone-icons/Weather/Cloudy-night.svg +11 -0
  711. package/src/icons/duotone-icons/Weather/Cloudy.svg +11 -0
  712. package/src/icons/duotone-icons/Weather/Day-rain.svg +11 -0
  713. package/src/icons/duotone-icons/Weather/Fahrenheit.svg +11 -0
  714. package/src/icons/duotone-icons/Weather/Fog.svg +15 -0
  715. package/src/icons/duotone-icons/Weather/Moon.svg +10 -0
  716. package/src/icons/duotone-icons/Weather/Night-fog.svg +11 -0
  717. package/src/icons/duotone-icons/Weather/Night-rain.svg +11 -0
  718. package/src/icons/duotone-icons/Weather/Rain#1.svg +11 -0
  719. package/src/icons/duotone-icons/Weather/Rain#2.svg +11 -0
  720. package/src/icons/duotone-icons/Weather/Rain#5.svg +11 -0
  721. package/src/icons/duotone-icons/Weather/Rainbow.svg +12 -0
  722. package/src/icons/duotone-icons/Weather/Snow#1.svg +11 -0
  723. package/src/icons/duotone-icons/Weather/Snow#2.svg +11 -0
  724. package/src/icons/duotone-icons/Weather/Snow#3.svg +11 -0
  725. package/src/icons/duotone-icons/Weather/Snow.svg +11 -0
  726. package/src/icons/duotone-icons/Weather/Storm.svg +11 -0
  727. package/src/icons/duotone-icons/Weather/Sun-fog.svg +11 -0
  728. package/src/icons/duotone-icons/Weather/Sun.svg +11 -0
  729. package/src/icons/duotone-icons/Weather/Suset#1.svg +11 -0
  730. package/src/icons/duotone-icons/Weather/Suset#2.svg +11 -0
  731. package/src/icons/duotone-icons/Weather/Temperature-empty.svg +10 -0
  732. package/src/icons/duotone-icons/Weather/Temperature-full.svg +10 -0
  733. package/src/icons/duotone-icons/Weather/Temperature-half.svg +10 -0
  734. package/src/icons/duotone-icons/Weather/Thunder-night.svg +11 -0
  735. package/src/icons/duotone-icons/Weather/Thunder.svg +11 -0
  736. package/src/icons/duotone-icons/Weather/Umbrella.svg +11 -0
  737. package/src/icons/duotone-icons/Weather/Wind.svg +11 -0
  738. package/src/icons/social/facebook.svg +10 -0
  739. package/src/icons/social/instagram.svg +10 -0
  740. package/src/icons/social/pinterest.svg +3 -0
  741. package/src/icons/social/twitter.svg +10 -0
  742. package/src/implemented-proposals/abi-management.md +161 -0
  743. package/src/implemented-proposals/bank-timestamp-correction.md +77 -0
  744. package/src/implemented-proposals/commitment.md +92 -0
  745. package/src/implemented-proposals/durable-tx-nonces.md +131 -0
  746. package/src/implemented-proposals/ed_overview/ed_economic_sustainability.md +9 -0
  747. package/src/implemented-proposals/ed_overview/ed_mvp.md +24 -0
  748. package/src/implemented-proposals/ed_overview/ed_overview.md +19 -0
  749. package/src/implemented-proposals/ed_overview/ed_references.md +7 -0
  750. package/src/implemented-proposals/ed_overview/ed_storage_rent_economics.md +17 -0
  751. package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_overview.md +9 -0
  752. package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_protocol_based_rewards.md +64 -0
  753. package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_transaction_fees.md +20 -0
  754. package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_validation_stake_delegation.md +28 -0
  755. package/src/implemented-proposals/implemented-proposals.md +9 -0
  756. package/src/implemented-proposals/installer.md +216 -0
  757. package/src/implemented-proposals/instruction_introspection.md +28 -0
  758. package/src/implemented-proposals/leader-leader-transition.md +55 -0
  759. package/src/implemented-proposals/leader-validator-transition.md +52 -0
  760. package/src/implemented-proposals/persistent-account-storage.md +83 -0
  761. package/src/implemented-proposals/readonly-accounts.md +25 -0
  762. package/src/implemented-proposals/reliable-vote-transmission.md +60 -0
  763. package/src/implemented-proposals/rent.md +69 -0
  764. package/src/implemented-proposals/repair-service.md +108 -0
  765. package/src/implemented-proposals/rpc-transaction-history.md +107 -0
  766. package/src/implemented-proposals/snapshot-verification.md +56 -0
  767. package/src/implemented-proposals/staking-rewards.md +33 -0
  768. package/src/implemented-proposals/testing-programs.md +53 -0
  769. package/src/implemented-proposals/tower-bft.md +138 -0
  770. package/src/implemented-proposals/transaction-fees.md +32 -0
  771. package/src/implemented-proposals/validator-timestamp-oracle.md +107 -0
  772. package/src/inflation/adjusted_staking_yield.md +118 -0
  773. package/src/inflation/inflation_schedule.md +40 -0
  774. package/src/inflation/terminology.md +54 -0
  775. package/src/integrations/exchange.md +753 -0
  776. package/src/introduction.md +33 -0
  777. package/src/offline-signing/durable-nonce.md +247 -0
  778. package/src/offline-signing.md +174 -0
  779. package/src/pages/index.js +160 -0
  780. package/src/pages/styles.module.css +41 -0
  781. package/src/proposals/accepted-design-proposals.md +11 -0
  782. package/src/proposals/accounts-db-replication.md +185 -0
  783. package/src/proposals/bankless-leader.md +57 -0
  784. package/src/proposals/block-confirmation.md +85 -0
  785. package/src/proposals/cluster-test-framework.md +102 -0
  786. package/src/proposals/comprehensive-compute-fees.md +164 -0
  787. package/src/proposals/embedding-move.md +37 -0
  788. package/src/proposals/interchain-transaction-verification.md +105 -0
  789. package/src/proposals/ledger-replication-to-implement.md +417 -0
  790. package/src/proposals/log_data.md +146 -0
  791. package/src/proposals/optimistic-confirmation-and-slashing.md +89 -0
  792. package/src/proposals/optimistic-transaction-propagation-signal.md +109 -0
  793. package/src/proposals/optimistic_confirmation.md +408 -0
  794. package/src/proposals/program-instruction-macro.md +226 -0
  795. package/src/proposals/return-data.md +144 -0
  796. package/src/proposals/rip-curl.md +56 -0
  797. package/src/proposals/rust-clients.md +54 -0
  798. package/src/proposals/simple-payment-and-state-verification.md +258 -0
  799. package/src/proposals/slashing.md +60 -0
  800. package/src/proposals/snapshot-verification.md +11 -0
  801. package/src/proposals/tick-verification.md +70 -0
  802. package/src/proposals/transactions-v2.md +334 -0
  803. package/src/proposals/validator-proposal.md +54 -0
  804. package/src/proposals/vote-signing-to-implement.md +116 -0
  805. package/src/running-validator/restart-cluster.md +117 -0
  806. package/src/running-validator/validator-failover.md +146 -0
  807. package/src/running-validator/validator-info.md +64 -0
  808. package/src/running-validator/validator-monitor.md +47 -0
  809. package/src/running-validator/validator-reqs.md +115 -0
  810. package/src/running-validator/validator-stake.md +132 -0
  811. package/src/running-validator/validator-start.md +492 -0
  812. package/src/running-validator/validator-troubleshoot.md +17 -0
  813. package/src/running-validator/vote-accounts.md +219 -0
  814. package/src/running-validator.md +7 -0
  815. package/src/staking/stake-accounts.md +141 -0
  816. package/src/staking/stake-programming.md +27 -0
  817. package/src/staking.md +117 -0
  818. package/src/storage_rent_economics.md +17 -0
  819. package/src/terminology.md +346 -0
  820. package/src/theme/Footer/index.js +126 -0
  821. package/src/theme/Footer/styles.module.css +15 -0
  822. package/src/transaction_fees.md +21 -0
  823. package/src/validator/anatomy.md +13 -0
  824. package/src/validator/blockstore.md +91 -0
  825. package/src/validator/gossip.md +90 -0
  826. package/src/validator/runtime.md +69 -0
  827. package/src/validator/tpu.md +5 -0
  828. package/src/validator/tvu.md +9 -0
  829. package/src/wallet-guide/apps.md +74 -0
  830. package/src/wallet-guide/cli.md +67 -0
  831. package/src/wallet-guide/file-system-wallet.md +65 -0
  832. package/src/wallet-guide/hardware-wallets/ledger.md +219 -0
  833. package/src/wallet-guide/hardware-wallets.md +53 -0
  834. package/src/wallet-guide/ledger-live.md +77 -0
  835. package/src/wallet-guide/paper-wallet.md +203 -0
  836. package/src/wallet-guide/solflare.md +201 -0
  837. package/src/wallet-guide/support.md +16 -0
  838. package/src/wallet-guide/web-wallets.md +52 -0
  839. package/src/wallet-guide.md +63 -0
  840. package/static/.nojekyll +0 -0
  841. package/static/img/favicon.ico +0 -0
  842. package/static/katex/README.md +91 -0
  843. package/static/katex/contrib/auto-render.js +350 -0
  844. package/static/katex/contrib/auto-render.min.js +1 -0
  845. package/static/katex/contrib/auto-render.mjs +226 -0
  846. package/static/katex/contrib/copy-tex.css +13 -0
  847. package/static/katex/contrib/copy-tex.js +213 -0
  848. package/static/katex/contrib/copy-tex.min.css +1 -0
  849. package/static/katex/contrib/copy-tex.min.js +1 -0
  850. package/static/katex/contrib/copy-tex.mjs +85 -0
  851. package/static/katex/contrib/mathtex-script-type.js +137 -0
  852. package/static/katex/contrib/mathtex-script-type.min.js +1 -0
  853. package/static/katex/contrib/mathtex-script-type.mjs +24 -0
  854. package/static/katex/contrib/mhchem.js +3241 -0
  855. package/static/katex/contrib/mhchem.min.js +1 -0
  856. package/static/katex/contrib/mhchem.mjs +3109 -0
  857. package/static/katex/contrib/render-a11y-string.js +870 -0
  858. package/static/katex/contrib/render-a11y-string.min.js +1 -0
  859. package/static/katex/contrib/render-a11y-string.mjs +753 -0
  860. package/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
  861. package/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
  862. package/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  863. package/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  864. package/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  865. package/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  866. package/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  867. package/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  868. package/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  869. package/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  870. package/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  871. package/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  872. package/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  873. package/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  874. package/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  875. package/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
  876. package/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
  877. package/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  878. package/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  879. package/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  880. package/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  881. package/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
  882. package/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
  883. package/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  884. package/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
  885. package/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
  886. package/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  887. package/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  888. package/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  889. package/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  890. package/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
  891. package/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
  892. package/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  893. package/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  894. package/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  895. package/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  896. package/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  897. package/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  898. package/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  899. package/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  900. package/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  901. package/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  902. package/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
  903. package/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
  904. package/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  905. package/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
  906. package/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
  907. package/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  908. package/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
  909. package/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
  910. package/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  911. package/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
  912. package/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
  913. package/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  914. package/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
  915. package/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
  916. package/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  917. package/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  918. package/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  919. package/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  920. package/static/katex/katex.css +1034 -0
  921. package/static/katex/katex.js +17308 -0
  922. package/static/katex/katex.min.css +1 -0
  923. package/static/katex/katex.min.js +1 -0
  924. package/static/katex/katex.mjs +16911 -0
@@ -0,0 +1,108 @@
1
+ ---
2
+ title: Repair Service
3
+ ---
4
+
5
+ ## Repair Service
6
+
7
+ The RepairService is in charge of retrieving missing shreds that failed to be
8
+ delivered by primary communication protocols like Turbine. It is in charge of
9
+ managing the protocols described below in the `Repair Protocols` section below.
10
+
11
+ ## Challenges:
12
+
13
+ 1\) Validators can fail to receive particular shreds due to network failures
14
+
15
+ 2\) Consider a scenario where blockstore contains the set of slots {1, 3, 5}.
16
+ Then Blockstore receives shreds for some slot 7, where for each of the shreds
17
+ b, b.parent == 6, so then the parent-child relation 6 -> 7 is stored in
18
+ blockstore. However, there is no way to chain these slots to any of the
19
+ existing banks in Blockstore, and thus the `Shred Repair` protocol will not
20
+ repair these slots. If these slots happen to be part of the main chain, this
21
+ will halt replay progress on this node.
22
+
23
+ ## Repair-related primitives
24
+
25
+ Epoch Slots:
26
+ Each validator advertises separately on gossip the various parts of an
27
+ `Epoch Slots`:
28
+
29
+ - The `stash`: An epoch-long compressed set of all completed slots.
30
+ - The `cache`: The Run-length Encoding (RLE) of the latest `N` completed
31
+ slots starting from some some slot `M`, where `N` is the number of slots
32
+ that will fit in an MTU-sized packet.
33
+
34
+ `Epoch Slots` in gossip are updated every time a validator receives a
35
+ complete slot within the epoch. Completed slots are detected by blockstore
36
+ and sent over a channel to RepairService. It is important to note that we
37
+ know that by the time a slot `X` is complete, the epoch schedule must exist
38
+ for the epoch that contains slot `X` because WindowService will reject
39
+ shreds for unconfirmed epochs.
40
+
41
+ Every `N/2` completed slots, the oldest `N/2` slots are moved from the
42
+ `cache` into the `stash`. The base value `M` for the RLE should also
43
+ be updated.
44
+
45
+ ## Repair Request Protocols
46
+
47
+ The repair protocol makes best attempts to progress the forking structure of
48
+ Blockstore.
49
+
50
+ The different protocol strategies to address the above challenges:
51
+
52
+ 1. Shred Repair \(Addresses Challenge \#1\): This is the most basic repair
53
+ protocol, with the purpose of detecting and filling "holes" in the ledger.
54
+ Blockstore tracks the latest root slot. RepairService will then periodically
55
+ iterate every fork in blockstore starting from the root slot, sending repair
56
+ requests to validators for any missing shreds. It will send at most some `N`
57
+ repair reqeusts per iteration. Shred repair should prioritize repairing
58
+ forks based on the leader's fork weight. Validators should only send repair
59
+ requests to validators who have marked that slot as completed in their
60
+ EpochSlots. Validators should prioritize repairing shreds in each slot
61
+ that they are responsible for retransmitting through turbine. Validators can
62
+ compute which shreds they are responsible for retransmitting because the
63
+ seed for turbine is based on leader id, slot, and shred index.
64
+
65
+ Note: Validators will only accept shreds within the current verifiable
66
+ epoch \(epoch the validator has a leader schedule for\).
67
+
68
+ 2. Preemptive Slot Repair \(Addresses Challenge \#2\): The goal of this
69
+ protocol is to discover the chaining relationship of "orphan" slots that do not
70
+ currently chain to any known fork. Shred repair should prioritize repairing
71
+ orphan slots based on the leader's fork weight.
72
+
73
+ - Blockstore will track the set of "orphan" slots in a separate column family.
74
+ - RepairService will periodically make `Orphan` requests for each of
75
+ the orphans in blockstore.
76
+
77
+ `Orphan(orphan)` request - `orphan` is the orphan slot that the
78
+ requestor wants to know the parents of `Orphan(orphan)` response -
79
+ The highest shreds for each of the first `N` parents of the requested
80
+ `orphan`
81
+
82
+ On receiving the responses `p`, where `p` is some shred in a parent slot,
83
+ validators will:
84
+
85
+ - Insert an empty `SlotMeta` in blockstore for `p.slot` if it doesn't
86
+ already exist.
87
+ - If `p.slot` does exist, update the parent of `p` based on `parents`
88
+
89
+ Note: that once these empty slots are added to blockstore, the
90
+ `Shred Repair` protocol should attempt to fill those slots.
91
+
92
+ Note: Validators will only accept responses containing shreds within the
93
+ current verifiable epoch \(epoch the validator has a leader schedule
94
+ for\).
95
+
96
+ Validators should try to send orphan requests to validators who have marked that
97
+ orphan as completed in their EpochSlots. If no such validators exist, then
98
+ randomly select a validator in a stake-weighted fashion.
99
+
100
+ ## Repair Response Protocol
101
+
102
+ When a validator receives a request for a shred `S`, they respond with the
103
+ shred if they have it.
104
+
105
+ When a validator receives a shred through a repair response, they check
106
+ `EpochSlots` to see if <= `1/3` of the network has marked this slot as
107
+ completed. If so, they resubmit this shred through its associated turbine
108
+ path, but only if this validator has not retransmitted this shred before.
@@ -0,0 +1,107 @@
1
+ # Long term RPC Transaction History
2
+
3
+ There's a need for RPC to serve at least 6 months of transaction history. The
4
+ current history, on the order of days, is insufficient for downstream users.
5
+
6
+ 6 months of transaction data cannot be stored practically in a validator's
7
+ rocksdb ledger so an external data store is necessary. The validator's
8
+ rocksdb ledger will continue to serve as the primary data source, and then will
9
+ fall back to the external data store.
10
+
11
+ The affected RPC endpoints are:
12
+
13
+ - [getFirstAvailableBlock](developing/clients/jsonrpc-api.md#getfirstavailableblock)
14
+ - [getConfirmedBlock](developing/clients/jsonrpc-api.md#getconfirmedblock)
15
+ - [getConfirmedBlocks](developing/clients/jsonrpc-api.md#getconfirmedblocks)
16
+ - [getConfirmedSignaturesForAddress](developing/clients/jsonrpc-api.md#getconfirmedsignaturesforaddress)
17
+ - [getConfirmedTransaction](developing/clients/jsonrpc-api.md#getconfirmedtransaction)
18
+ - [getSignatureStatuses](developing/clients/jsonrpc-api.md#getsignaturestatuses)
19
+ - [getBlockTime](developing/clients/jsonrpc-api.md#getblocktime)
20
+
21
+ Some system design constraints:
22
+
23
+ - The volume of data to store and search can quickly jump into the terabytes,
24
+ and is immutable.
25
+ - The system should be as light as possible for SREs. For example an SQL
26
+ database cluster that requires an SRE to continually monitor and rebalance
27
+ nodes is undesirable.
28
+ - Data must be searchable in real time - batched queries that take minutes or
29
+ hours to run are unacceptable.
30
+ - Easy to replicate the data worldwide to co-locate it with the RPC endpoints
31
+ that will utilize it.
32
+ - Interfacing with the external data store should be easy and not require
33
+ depending on risky lightly-used community-supported code libraries
34
+
35
+ Based on these constraints, Google's BigTable product is selected as the data
36
+ store.
37
+
38
+ ## Table Schema
39
+
40
+ A BigTable instance is used to hold all transaction data, broken up into
41
+ different tables for quick searching.
42
+
43
+ New data may be copied into the instance at anytime without affecting the existing
44
+ data, and all data is immutable. Generally the expectation is that new data
45
+ will be uploaded once an current epoch completes but there is no limitation on
46
+ the frequency of data dumps.
47
+
48
+ Cleanup of old data is automatic by configuring the data retention policy of the
49
+ instance tables appropriately, it just disappears. Therefore the order of when data is
50
+ added becomes important. For example if data from epoch N-1 is added after data
51
+ from epoch N, the older epoch data will outlive the newer data. However beyond
52
+ producing _holes_ in query results, this kind of unordered deletion will
53
+ have no ill effect. Note that this method of cleanup effectively allows for an
54
+ unlimited amount of transaction data to be stored, restricted only by the
55
+ monetary costs of doing so.
56
+
57
+ The table layout s supports the existing RPC endpoints only. New RPC endpoints
58
+ in the future may require additions to the schema and potentially iterating over
59
+ all transactions to build up the necessary metadata.
60
+
61
+ ## Accessing BigTable
62
+
63
+ BigTable has a gRPC endpoint that can be accessed using the
64
+ [tonic](https://crates.io/crates/crate)] and the raw protobuf API, as currently no
65
+ higher-level Rust crate for BigTable exists. Practically this makes parsing the
66
+ results of BigTable queries more complicated but is not a significant issue.
67
+
68
+ ## Data Population
69
+
70
+ The ongoing population of instance data will occur on an epoch cadence through the
71
+ use of a new `solana-ledger-tool` command that will convert rocksdb data for a
72
+ given slot range into the instance schema.
73
+
74
+ The same process will be run once, manually, to backfill the existing ledger
75
+ data.
76
+
77
+ ### Block Table: `block`
78
+
79
+ This table contains the compressed block data for a given slot.
80
+
81
+ The row key is generated by taking the 16 digit lower case hexadecimal
82
+ representation of the slot, to ensure that the oldest slot with a confirmed
83
+ block will always be first when the rows are listed. eg, The row key for slot
84
+ 42 would be 000000000000002a.
85
+
86
+ The row data is a compressed `StoredConfirmedBlock` struct.
87
+
88
+ ### Account Address Transaction Signature Lookup Table: `tx-by-addr`
89
+
90
+ This table contains the transactions that affect a given address.
91
+
92
+ The row key is `<base58 address>/<slot-id-one's-compliment-hex-slot-0-prefixed-to-16-digits>`. The row
93
+ data is a compressed `TransactionByAddrInfo` struct.
94
+
95
+ Taking the one's compliment of the slot allows for listing of slots ensures that
96
+ the newest slot with transactions that affect an address will always
97
+ be listed first.
98
+
99
+ Sysvar addresses are not indexed. However frequently used programs such as
100
+ Vote or System are, and will likely have a row for every confirmed slot.
101
+
102
+ ### Transaction Signature Lookup Table: `tx`
103
+
104
+ This table maps a transaction signature to its confirmed block, and index within that block.
105
+
106
+ The row key is the base58-encoded transaction signature.
107
+ The row data is a compressed `TransactionInfo` struct.
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: Snapshot Verification
3
+ ---
4
+
5
+ ## Problem
6
+
7
+ When a validator boots up from a snapshot, it needs a way to verify the account set matches what the rest of the network sees quickly. A potential
8
+ attacker could give the validator an incorrect state, and then try to convince it to accept a transaction that would otherwise be rejected.
9
+
10
+ ## Solution
11
+
12
+ Currently the bank hash is derived from hashing the delta state of the accounts in a slot which is then combined with the previous bank hash value.
13
+ The problem with this is that the list of hashes will grow on the order of the number of slots processed by the chain and become a burden to both
14
+ transmit and verify successfully.
15
+
16
+ Another naive method could be to create a merkle tree of the account state. This has the downside that with each account update, the merkle tree
17
+ would have to be recomputed from the entire account state of all live accounts in the system.
18
+
19
+ To verify the snapshot, we do the following:
20
+
21
+ On account store of non-zero lamport accounts, we hash the following data:
22
+
23
+ - Account owner
24
+ - Account data
25
+ - Account pubkey
26
+ - Account lamports balance
27
+ - Fork the account is stored on
28
+
29
+ Use this resulting hash value as input to an expansion function which expands the hash value into an image value.
30
+ The function will create a 440 byte block of data where the first 32 bytes are the hash value, and the next 440 - 32 bytes are
31
+ generated from a Chacha RNG with the hash as the seed.
32
+
33
+ The account images are then combined with xor. The previous account value will be xored into the state and the new account value also xored into the state.
34
+
35
+ Voting and sysvar hash values occur with the hash of the resulting full image value.
36
+
37
+ On validator boot, when it loads from a snapshot, it would verify the hash value with the accounts set. It would then
38
+ use SPV to display the percentage of the network that voted for the hash value given.
39
+
40
+ The resulting value can be verified by a validator to be the result of xoring all current account states together.
41
+
42
+ A snapshot must be purged of zero lamport accounts before creation and during verify since the zero lamport accounts do not affect the hash value but may cause
43
+ a validator bank to read that an account is not present when it really should be.
44
+
45
+ An attack on the xor state could be made to influence its value:
46
+
47
+ Thus the 440 byte image size comes from this paper, avoiding xor collision with 0 \(or thus any other given bit pattern\): \[[https://link.springer.com/content/pdf/10.1007%2F3-540-45708-9_19.pdf](https://link.springer.com/content/pdf/10.1007%2F3-540-45708-9_19.pdf)\]
48
+
49
+ The math provides 128 bit security in this case:
50
+
51
+ ```text
52
+ O(k * 2^(n/(1+lg(k)))
53
+ k=2^40 accounts
54
+ n=440
55
+ 2^(40) * 2^(448 * 8 / 41) ~= O(2^(128))
56
+ ```
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Staking Rewards
3
+ ---
4
+
5
+ A Proof of Stake \(PoS\), \(i.e. using in-protocol asset, SOL, to provide secure consensus\) design is outlined here. Solana implements a proof of stake reward/security scheme for validator nodes in the cluster. The purpose is threefold:
6
+
7
+ - Align validator incentives with that of the greater cluster through skin-in-the-game deposits at risk
8
+
9
+ - Avoid 'nothing at stake' fork voting issues by implementing slashing rules aimed at promoting fork convergence
10
+
11
+ - Provide an avenue for validator rewards provided as a function of validator participation in the cluster.
12
+
13
+ While many of the details of the specific implementation are currently under consideration and are expected to come into focus through specific modeling studies and parameter exploration on the Solana testnet, we outline here our current thinking on the main components of the PoS system. Much of this thinking is based on the current status of Casper FFG, with optimizations and specific attributes to be modified as is allowed by Solana's Proof of History \(PoH\) blockchain data structure.
14
+
15
+ ## General Overview
16
+
17
+ Solana's ledger validation design is based on a rotating, stake-weighted selected leader broadcasting transactions in a PoH data structure to validating nodes. These nodes, upon receiving the leader's broadcast, have the opportunity to vote on the current state and PoH height by signing a transaction into the PoH stream.
18
+
19
+ To become a Solana validator, one must deposit/lock-up some amount of SOL in a contract. This SOL will not be accessible for a specific time period. The precise duration of the staking lockup period has not been determined. However we can consider three phases of this time for which specific parameters will be necessary:
20
+
21
+ - _Warm-up period_: which SOL is deposited and inaccessible to the node, however PoH transaction validation has not begun. Most likely on the order of days to weeks
22
+
23
+ - _Validation period_: a minimum duration for which the deposited SOL will be inaccessible, at risk of slashing \(see slashing rules below\) and earning rewards for the validator participation. Likely duration of months to a year.
24
+
25
+ - _Cool-down period_: a duration of time following the submission of a 'withdrawal' transaction. During this period validation responsibilities have been removed and the funds continue to be inaccessible. Accumulated rewards should be delivered at the end of this period, along with the return of the initial deposit.
26
+
27
+ Solana's trustless sense of time and ordering provided by its PoH data structure, along with its [turbine](https://www.youtube.com/watch?v=qt_gDRXHrHQ&t=1s) data broadcast and transmission design, should provide sub-second transaction confirmation times that scale with the log of the number of nodes in the cluster. This means we shouldn't have to restrict the number of validating nodes with a prohibitive 'minimum deposits' and expect nodes to be able to become validators with nominal amounts of SOL staked. At the same time, Solana's focus on high-throughput should create incentive for validation clients to provide high-performant and reliable hardware. Combined with potential a minimum network speed threshold to join as a validation-client, we expect a healthy validation delegation market to emerge.
28
+
29
+ ## Penalties
30
+
31
+ As discussed in the [Economic Design](ed_overview/ed_overview.md) section, annual validator interest rates are to be specified as a function of total percentage of circulating supply that has been staked. The cluster rewards validators who are online and actively participating in the validation process throughout the entirety of their _validation period_. For validators that go offline/fail to validate transactions during this period, their annual reward is effectively reduced.
32
+
33
+ Similarly, we may consider an algorithmic reduction in a validator's active amount staked amount in the case that they are offline. I.e. if a validator is inactive for some amount of time, either due to a partition or otherwise, the amount of their stake that is considered ‘active’ \(eligible to earn rewards\) may be reduced. This design would be structured to help long-lived partitions to eventually reach finality on their respective chains as the % of non-voting total stake is reduced over time until a supermajority can be achieved by the active validators in each partition. Similarly, upon re-engaging, the ‘active’ amount staked will come back online at some defined rate. Different rates of stake reduction may be considered depending on the size of the partition/active set.
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: Testing Programs
3
+ ---
4
+
5
+ Applications send transactions to a Solana cluster and query validators to confirm the transactions were processed and to check each transaction's result. When the cluster doesn't behave as anticipated, it could be for a number of reasons:
6
+
7
+ - The program is buggy
8
+ - The BPF loader rejected an unsafe program instruction
9
+ - The transaction was too big
10
+ - The transaction was invalid
11
+ - The Runtime tried to execute the transaction when another one was accessing
12
+
13
+ the same account
14
+
15
+ - The network dropped the transaction
16
+ - The cluster rolled back the ledger
17
+ - A validator responded to queries maliciously
18
+
19
+ ## The AsyncClient and SyncClient Traits
20
+
21
+ To troubleshoot, the application should retarget a lower-level component, where fewer errors are possible. Retargeting can be done with different implementations of the AsyncClient and SyncClient traits.
22
+
23
+ Components implement the following primary methods:
24
+
25
+ ```text
26
+ trait AsyncClient {
27
+ fn async_send_transaction(&self, transaction: Transaction) -> io::Result<Signature>;
28
+ }
29
+
30
+ trait SyncClient {
31
+ fn get_signature_status(&self, signature: &Signature) -> Result<Option<transaction::Result<()>>>;
32
+ }
33
+ ```
34
+
35
+ Users send transactions and asynchrounously and synchrounously await results.
36
+
37
+ ### ThinClient for Clusters
38
+
39
+ The highest level implementation, ThinClient, targets a Solana cluster, which may be a deployed testnet or a local cluster running on a development machine.
40
+
41
+ ### TpuClient for the TPU
42
+
43
+ The next level is the TPU implementation, which is not yet implemented. At the TPU level, the application sends transactions over Rust channels, where there can be no surprises from network queues or dropped packets. The TPU implements all "normal" transaction errors. It does signature verification, may report account-in-use errors, and otherwise results in the ledger, complete with proof of history hashes.
44
+
45
+ ## Low-level testing
46
+
47
+ ### BankClient for the Bank
48
+
49
+ Below the TPU level is the Bank. The Bank doesn't do signature verification or generate a ledger. The Bank is a convenient layer at which to test new on-chain programs. It allows developers to toggle between native program implementations and BPF-compiled variants. No need for the Transact trait here. The Bank's API is synchronous.
50
+
51
+ ## Unit-testing with the Runtime
52
+
53
+ Below the Bank is the Runtime. The Runtime is the ideal test environment for unit-testing. By statically linking the Runtime into a native program implementation, the developer gains the shortest possible edit-compile-run loop. Without any dynamic linking, stack traces include debug symbols and program errors are straightforward to troubleshoot.
@@ -0,0 +1,138 @@
1
+ ---
2
+ title: Tower BFT
3
+ ---
4
+
5
+ This design describes Solana's _Tower BFT_ algorithm. It addresses the following problems:
6
+
7
+ - Some forks may not end up accepted by the supermajority of the cluster, and voters need to recover from voting on such forks.
8
+ - Many forks may be votable by different voters, and each voter may see a different set of votable forks. The selected forks should eventually converge for the cluster.
9
+ - Reward based votes have an associated risk. Voters should have the ability to configure how much risk they take on.
10
+ - The [cost of rollback](tower-bft.md#cost-of-rollback) needs to be computable. It is important to clients that rely on some measurable form of Consistency. The costs to break consistency need to be computable, and increase super-linearly for older votes.
11
+ - ASIC speeds are different between nodes, and attackers could employ Proof of History ASICS that are much faster than the rest of the cluster. Consensus needs to be resistant to attacks that exploit the variability in Proof of History ASIC speed.
12
+
13
+ For brevity this design assumes that a single voter with a stake is deployed as an individual validator in the cluster.
14
+
15
+ ## Time
16
+
17
+ The Solana cluster generates a source of time via a Verifiable Delay Function we are calling [Proof of History](../cluster/synchronization.md).
18
+
19
+ Proof of History is used to create a deterministic round robin schedule for all the active leaders. At any given time only 1 leader, which can be computed from the ledger itself, can propose a fork. For more details, see [fork generation](../cluster/fork-generation.md) and [leader rotation](../cluster/leader-rotation.md).
20
+
21
+ ## Lockouts
22
+
23
+ The purpose of the lockout is to force a validator to commit opportunity cost to a specific fork. Lockouts are measured in slots, and therefor represent a real-time forced delay that a validator needs to wait before breaking the commitment to a fork.
24
+
25
+ Validators that violate the lockouts and vote for a diverging fork within the lockout should be punished. The proposed punishment is to slash the validator stake if a concurrent vote within a lockout for a non-descendant fork can be proven to the cluster.
26
+
27
+ ## Algorithm
28
+
29
+ The basic idea to this approach is to stack consensus votes and double lockouts. Each vote in the stack is a confirmation of a fork. Each confirmed fork is an ancestor of the fork above it. Each vote has a `lockout` in units of slots before the validator can submit a vote that does not contain the confirmed fork as an ancestor.
30
+
31
+ When a vote is added to the stack, the lockouts of all the previous votes in the stack are doubled \(more on this in [Rollback](tower-bft.md#Rollback)\). With each new vote, a validator commits the previous votes to an ever-increasing lockout. At 32 votes we can consider the vote to be at `max lockout` any votes with a lockout equal to or above `1<<32` are dequeued \(FIFO\). Dequeuing a vote is the trigger for a reward. If a vote expires before it is dequeued, it and all the votes above it are popped \(LIFO\) from the vote stack. The validator needs to start rebuilding the stack from that point.
32
+
33
+ ### Rollback
34
+
35
+ Before a vote is pushed to the stack, all the votes leading up to vote with a lower lock time than the new vote are popped. After rollback lockouts are not doubled until the validator catches up to the rollback height of votes.
36
+
37
+ For example, a vote stack with the following state:
38
+
39
+ | vote | vote time | lockout | lock expiration time |
40
+ | ---: | --------: | ------: | -------------------: |
41
+ | 4 | 4 | 2 | 6 |
42
+ | 3 | 3 | 4 | 7 |
43
+ | 2 | 2 | 8 | 10 |
44
+ | 1 | 1 | 16 | 17 |
45
+
46
+ _Vote 5_ is at time 9, and the resulting state is
47
+
48
+ | vote | vote time | lockout | lock expiration time |
49
+ | ---: | --------: | ------: | -------------------: |
50
+ | 5 | 9 | 2 | 11 |
51
+ | 2 | 2 | 8 | 10 |
52
+ | 1 | 1 | 16 | 17 |
53
+
54
+ _Vote 6_ is at time 10
55
+
56
+ | vote | vote time | lockout | lock expiration time |
57
+ | ---: | --------: | ------: | -------------------: |
58
+ | 6 | 10 | 2 | 12 |
59
+ | 5 | 9 | 4 | 13 |
60
+ | 2 | 2 | 8 | 10 |
61
+ | 1 | 1 | 16 | 17 |
62
+
63
+ At time 10 the new votes caught up to the previous votes. But _vote 2_ expires at 10, so the when _vote 7_ at time 11 is applied the votes including and above _vote 2_ will be popped.
64
+
65
+ | vote | vote time | lockout | lock expiration time |
66
+ | ---: | --------: | ------: | -------------------: |
67
+ | 7 | 11 | 2 | 13 |
68
+ | 1 | 1 | 16 | 17 |
69
+
70
+ The lockout for vote 1 will not increase from 16 until the stack contains 5 votes.
71
+
72
+ ### Slashing and Rewards
73
+
74
+ Validators should be rewarded for selecting the fork that the rest of the cluster selected as often as possible. This is well-aligned with generating a reward when the vote stack is full and the oldest vote needs to be dequeued. Thus a reward should be generated for each successful dequeue.
75
+
76
+ ### Cost of Rollback
77
+
78
+ Cost of rollback of _fork A_ is defined as the cost in terms of lockout time to the validator to confirm any other fork that does not include _fork A_ as an ancestor.
79
+
80
+ The **Economic Finality** of _fork A_ can be calculated as the loss of all the rewards from rollback of _fork A_ and its descendants, plus the opportunity cost of reward due to the exponentially growing lockout of the votes that have confirmed _fork A_.
81
+
82
+ ### Thresholds
83
+
84
+ Each validator can independently set a threshold of cluster commitment to a fork before that validator commits to a fork. For example, at vote stack index 7, the lockout is 256 time units. A validator may withhold votes and let votes 0-7 expire unless the vote at index 7 has at greater than 50% commitment in the cluster. This allows each validator to independently control how much risk to commit to a fork. Committing to forks at a higher frequency would allow the validator to earn more rewards.
85
+
86
+ ### Algorithm parameters
87
+
88
+ The following parameters need to be tuned:
89
+
90
+ - Number of votes in the stack before dequeue occurs \(32\).
91
+ - Rate of growth for lockouts in the stack \(2x\).
92
+ - Starting default lockout \(2\).
93
+ - Threshold depth for minimum cluster commitment before committing to the fork \(8\).
94
+ - Minimum cluster commitment size at threshold depth \(50%+\).
95
+
96
+ ### Free Choice
97
+
98
+ A "Free Choice" is an unenforcible validator action. There is no way for the protocol to encode and enforce these actions since each validator can modify the code and adjust the algorithm. A validator that maximizes self-reward over all possible futures should behave in such a way that the system is stable, and the local greedy choice should result in a greedy choice over all possible futures. A set of validator that are engaging in choices to disrupt the protocol should be bound by their stake weight to the denial of service. Two options exits for validator:
99
+
100
+ - a validator can outrun previous validator in virtual generation and submit a concurrent fork
101
+ - a validator can withhold a vote to observe multiple forks before voting
102
+
103
+ In both cases, the validator in the cluster have several forks to pick from concurrently, even though each fork represents a different height. In both cases it is impossible for the protocol to detect if the validator behavior is intentional or not.
104
+
105
+ ### Greedy Choice for Concurrent Forks
106
+
107
+ When evaluating multiple forks, each validator should use the following rules:
108
+
109
+ 1. Forks must satisfy the _Threshold_ rule.
110
+ 2. Pick the fork that maximizes the total cluster lockout time for all the ancestor forks.
111
+ 3. Pick the fork that has the greatest amount of cluster transaction fees.
112
+ 4. Pick the latest fork in terms of PoH.
113
+
114
+ Cluster transaction fees are fees that are deposited to the mining pool as described in the [Staking Rewards](staking-rewards.md) section.
115
+
116
+ ## PoH ASIC Resistance
117
+
118
+ Votes and lockouts grow exponentially while ASIC speed up is linear. There are two possible attack vectors involving a faster ASIC.
119
+
120
+ ### ASIC censorship
121
+
122
+ An attacker generates a concurrent fork that outruns previous leaders in an effort to censor them. A fork proposed by this attacker will be available concurrently with the next available leader. For nodes to pick this fork it must satisfy the _Greedy Choice_ rule.
123
+
124
+ 1. Fork must have equal number of votes for the ancestor fork.
125
+ 2. Fork cannot be so far a head as to cause expired votes.
126
+ 3. Fork must have a greater amount of cluster transaction fees.
127
+
128
+ This attack is then limited to censoring the previous leaders fees, and individual transactions. But it cannot halt the cluster, or reduce the validator set compared to the concurrent fork. Fee censorship is limited to access fees going to the leaders but not the validators.
129
+
130
+ ### ASIC Rollback
131
+
132
+ An attacker generates a concurrent fork from an older block to try to rollback the cluster. In this attack the concurrent fork is competing with forks that have already been voted on. This attack is limited by the exponential growth of the lockouts.
133
+
134
+ - 1 vote has a lockout of 2 slots. Concurrent fork must be at least 2 slots ahead, and be produced in 1 slot. Therefore requires an ASIC 2x faster.
135
+ - 2 votes have a lockout of 4 slots. Concurrent fork must be at least 4 slots ahead and produced in 2 slots. Therefore requires an ASIC 2x faster.
136
+ - 3 votes have a lockout of 8 slots. Concurrent fork must be at least 8 slots ahead and produced in 3 slots. Therefore requires an ASIC 2.6x faster.
137
+ - 10 votes have a lockout of 1024 slots. 1024/10, or 102.4x faster ASIC.
138
+ - 20 votes have a lockout of 2^20 slots. 2^20/20, or 52,428.8x faster ASIC.
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: Deterministic Transaction Fees
3
+ ---
4
+
5
+ Transactions currently include a fee field that indicates the maximum fee field a slot leader is permitted to charge to process a transaction. The cluster, on the other hand, agrees on a minimum fee. If the network is congested, the slot leader may prioritize the transactions offering higher fees. That means the client won't know how much was collected until the transaction is confirmed by the cluster and the remaining balance is checked. It smells of exactly what we dislike about Ethereum's "gas", non-determinism.
6
+
7
+ ## Congestion-driven fees
8
+
9
+ Each validator uses _signatures per slot_ \(SPS\) to estimate network congestion and _SPS target_ to estimate the desired processing capacity of the cluster. The validator learns the SPS target from the genesis config, whereas it calculates SPS from recently processed transactions. The genesis config also defines a target `lamports_per_signature`, which is the fee to charge per signature when the cluster is operating at _SPS target_.
10
+
11
+ ## Calculating fees
12
+
13
+ The client uses the JSON RPC API to query the cluster for the current fee parameters. Those parameters are tagged with a blockhash and remain valid until that blockhash is old enough to be rejected by the slot leader.
14
+
15
+ Before sending a transaction to the cluster, a client may submit the transaction and fee account data to an SDK module called the _fee calculator_. So long as the client's SDK version matches the slot leader's version, the client is assured that its account will be changed exactly the same number of lamports as returned by the fee calculator.
16
+
17
+ ## Fee Parameters
18
+
19
+ In the first implementation of this design, the only fee parameter is `lamports_per_signature`. The more signatures the cluster needs to verify, the higher the fee. The exact number of lamports is determined by the ratio of SPS to the SPS target. At the end of each slot, the cluster lowers `lamports_per_signature` when SPS is below the target and raises it when above the target. The minimum value for `lamports_per_signature` is 50% of the target `lamports_per_signature` and the maximum value is 10x the target \`lamports_per_signature'
20
+
21
+ Future parameters might include:
22
+
23
+ - `lamports_per_pubkey` - cost to load an account
24
+ - `lamports_per_slot_distance` - higher cost to load very old accounts
25
+ - `lamports_per_byte` - cost per size of account loaded
26
+ - `lamports_per_bpf_instruction` - cost to run a program
27
+
28
+ ## Attacks
29
+
30
+ ### Hijacking the SPS Target
31
+
32
+ A group of validators can centralize the cluster if they can convince it to raise the SPS Target above a point where the rest of the validators can keep up. Raising the target will cause fees to drop, presumably creating more demand and therefore higher TPS. If the validator doesn't have hardware that can process that many transactions that fast, its confirmation votes will eventually get so long that the cluster will be forced to boot it.
@@ -0,0 +1,107 @@
1
+ ---
2
+ title: Validator Timestamp Oracle
3
+ ---
4
+
5
+ Third-party users of Solana sometimes need to know the real-world time a block
6
+ was produced, generally to meet compliance requirements for external auditors or
7
+ law enforcement. This proposal describes a validator timestamp oracle that
8
+ would allow a Solana cluster to satisfy this need.
9
+
10
+ The general outline of the proposed implementation is as follows:
11
+
12
+ - At regular intervals, each validator records its observed time for a known slot
13
+ on-chain (via a Timestamp added to a slot Vote)
14
+ - A client can request a block time for a rooted block using the `getBlockTime`
15
+ RPC method. When a client requests a timestamp for block N:
16
+
17
+ 1. A validator determines a "cluster" timestamp for a recent timestamped slot
18
+ before block N by observing all the timestamped Vote instructions recorded on
19
+ the ledger that reference that slot, and determining the stake-weighted mean
20
+ timestamp.
21
+
22
+ 2. This recent mean timestamp is then used to calculate the timestamp of
23
+ block N using the cluster's established slot duration
24
+
25
+ Requirements:
26
+
27
+ - Any validator replaying the ledger in the future must come up with the same
28
+ time for every block since genesis
29
+ - Estimated block times should not drift more than an hour or so before resolving
30
+ to real-world (oracle) data
31
+ - The block times are not controlled by a single centralized oracle, but
32
+ ideally based on a function that uses inputs from all validators
33
+ - Each validator must maintain a timestamp oracle
34
+
35
+ The same implementation can provide a timestamp estimate for a not-yet-rooted
36
+ block. However, because the most recent timestamped slot may or may not be
37
+ rooted yet, this timestamp would be unstable (potentially failing requirement
38
+ 1). Initial implementation will target rooted blocks, but if there is a use case
39
+ for recent-block timestamping, it will be trivial to add the RPC apis in the
40
+ future.
41
+
42
+ ## Recording Time
43
+
44
+ At regular intervals as it is voting on a particular slot, each validator
45
+ records its observed time by including a timestamp in its Vote instruction
46
+ submission. The corresponding slot for the timestamp is the newest Slot in the
47
+ Vote vector (`Vote::slots.iter().max()`). It is signed by the validator's
48
+ identity keypair as a usual Vote. In order to enable this reporting, the Vote
49
+ struct needs to be extended to include a timestamp field, `timestamp: Option<UnixTimestamp>`, which will be set to `None` in most Votes.
50
+
51
+ As of https://github.com/solana-labs/solana/pull/10630, validators submit a
52
+ timestamp every vote. This enables implementation of a block time caching
53
+ service that allows nodes to calculate the estimated timestamp immediately after
54
+ the block is rooted, and cache that value in Blockstore. This provides
55
+ persistent data and quick queries, while still meeting requirement 1) above.
56
+
57
+ ### Vote Accounts
58
+
59
+ A validator's vote account will hold its most recent slot-timestamp in VoteState.
60
+
61
+ ### Vote Program
62
+
63
+ The on-chain Vote program needs to be extended to process a timestamp sent with
64
+ a Vote instruction from validators. In addition to its current process_vote
65
+ functionality (including loading the correct Vote account and verifying that the
66
+ transaction signer is the expected validator), this process needs to compare the
67
+ timestamp and corresponding slot to the currently stored values to verify that
68
+ they are both monotonically increasing, and store the new slot and timestamp in
69
+ the account.
70
+
71
+ ## Calculating Stake-Weighted Mean Timestamp
72
+
73
+ In order to calculate the estimated timestamp for a particular block, a
74
+ validator first needs to identify the most recently timestamped slot:
75
+
76
+ ```text
77
+ let timestamp_slot = floor(current_slot / timestamp_interval);
78
+ ```
79
+
80
+ Then the validator needs to gather all Vote WithTimestamp transactions from the
81
+ ledger that reference that slot, using `Blockstore::get_slot_entries()`. As these
82
+ transactions could have taken some time to reach and be processed by the leader,
83
+ the validator needs to scan several completed blocks after the timestamp_slot to
84
+ get a reasonable set of Timestamps. The exact number of slots will need to be
85
+ tuned: More slots will enable greater cluster participation and more timestamp
86
+ datapoints; fewer slots will speed how long timestamp filtering takes.
87
+
88
+ From this collection of transactions, the validator calculates the
89
+ stake-weighted mean timestamp, cross-referencing the epoch stakes from
90
+ `staking_utils::staked_nodes_at_epoch()`.
91
+
92
+ Any validator replaying the ledger should derive the same stake-weighted mean
93
+ timestamp by processing the Timestamp transactions from the same number of
94
+ slots.
95
+
96
+ ## Calculating Estimated Time for a Particular Block
97
+
98
+ Once the mean timestamp for a known slot is calculated, it is trivial to
99
+ calculate the estimated timestamp for subsequent block N:
100
+
101
+ ```text
102
+ let block_n_timestamp = mean_timestamp + (block_n_slot_offset * slot_duration);
103
+ ```
104
+
105
+ where `block_n_slot_offset` is the difference between the slot of block N and
106
+ the timestamp_slot, and `slot_duration` is derived from the cluster's
107
+ `slots_per_year` stored in each Bank