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.
- package/.eslintignore +8 -0
- package/.eslintrc +21 -0
- package/.prettierignore +7 -0
- package/.travis/before_install.sh +9 -0
- package/.travis/script.sh +4 -0
- package/README.md +59 -0
- package/art/data-plane-fanout.bob +19 -0
- package/art/data-plane-neighborhood.bob +25 -0
- package/art/data-plane-seeding.bob +15 -0
- package/art/data-plane.bob +18 -0
- package/art/fork-generation.bob +13 -0
- package/art/forks-pruned.bob +9 -0
- package/art/forks-pruned2.bob +11 -0
- package/art/forks.bob +13 -0
- package/art/passive-staking-callflow.msc +30 -0
- package/art/retransmit_stage.bob +45 -0
- package/art/runtime.bob +10 -0
- package/art/sdk-tools.bob +20 -0
- package/art/spv-bank-hash.bob +19 -0
- package/art/spv-block-merkle.bob +19 -0
- package/art/tpu.bob +19 -0
- package/art/tvu.bob +37 -0
- package/art/validator-proposal.bob +60 -0
- package/art/validator.bob +30 -0
- package/babel.config.js +3 -0
- package/build-cli-usage.sh +42 -0
- package/build.sh +40 -0
- package/convert-ascii-to-svg.sh +21 -0
- package/crowdin.yml +16 -0
- package/docusaurus.config.js +161 -0
- package/offline-cmd-md-links.sh +11 -0
- package/package.json +50 -0
- package/publish-docs.sh +56 -0
- package/set-solana-release-tag.sh +20 -0
- package/sidebars.js +210 -0
- package/src/cli/.usage.md.header +59 -0
- package/src/cli/choose-a-cluster.md +43 -0
- package/src/cli/conventions.md +80 -0
- package/src/cli/delegate-stake.md +206 -0
- package/src/cli/deploy-a-program.md +302 -0
- package/src/cli/install-solana-cli-tools.md +164 -0
- package/src/cli/transfer-tokens.md +158 -0
- package/src/cli.md +22 -0
- package/src/cluster/bench-tps.md +129 -0
- package/src/cluster/fork-generation.md +64 -0
- package/src/cluster/leader-rotation.md +88 -0
- package/src/cluster/managing-forks.md +36 -0
- package/src/cluster/overview.md +39 -0
- package/src/cluster/performance-metrics.md +25 -0
- package/src/cluster/rpc-endpoints.md +50 -0
- package/src/cluster/stake-delegation-and-rewards.md +197 -0
- package/src/cluster/synchronization.md +28 -0
- package/src/cluster/turbine-block-propagation.md +101 -0
- package/src/cluster/vote-signing.md +59 -0
- package/src/clusters.md +173 -0
- package/src/css/custom.css +73 -0
- package/src/developing/backwards-compatibility.md +151 -0
- package/src/developing/clients/javascript-api.md +332 -0
- package/src/developing/clients/javascript-reference.md +750 -0
- package/src/developing/clients/jsonrpc-api.md +5173 -0
- package/src/developing/clients/rust-api.md +36 -0
- package/src/developing/on-chain-programs/debugging.md +110 -0
- package/src/developing/on-chain-programs/deploying.md +24 -0
- package/src/developing/on-chain-programs/developing-c.md +202 -0
- package/src/developing/on-chain-programs/developing-rust.md +406 -0
- package/src/developing/on-chain-programs/examples.md +61 -0
- package/src/developing/on-chain-programs/faq.md +81 -0
- package/src/developing/on-chain-programs/overview.md +218 -0
- package/src/developing/plugins/accountsdb_plugin.md +360 -0
- package/src/developing/programming-model/accounts.md +231 -0
- package/src/developing/programming-model/calling-between-programs.md +351 -0
- package/src/developing/programming-model/overview.md +17 -0
- package/src/developing/programming-model/runtime.md +131 -0
- package/src/developing/programming-model/transactions.md +210 -0
- package/src/developing/runtime-facilities/programs.md +168 -0
- package/src/developing/runtime-facilities/sysvars.md +142 -0
- package/src/developing/test-validator.md +153 -0
- package/src/economics_overview.md +20 -0
- package/src/history.md +60 -0
- package/src/icons/Archivers.inline.svg +11 -0
- package/src/icons/Bulb.inline.svg +13 -0
- package/src/icons/Chat.inline.svg +10 -0
- package/src/icons/Clipboard.inline.svg +13 -0
- package/src/icons/Cloudbreak.inline.svg +11 -0
- package/src/icons/Code.inline.svg +11 -0
- package/src/icons/Fire.inline.svg +10 -0
- package/src/icons/Gamepad.inline.svg +11 -0
- package/src/icons/Globe.inline.svg +1 -0
- package/src/icons/Gulfstream.inline.svg +11 -0
- package/src/icons/History.inline.svg +11 -0
- package/src/icons/Money.inline.svg +11 -0
- package/src/icons/Pipeline.inline.svg +15 -0
- package/src/icons/PoH.inline.svg +11 -0
- package/src/icons/Sealevel.inline.svg +11 -0
- package/src/icons/Tools.inline.svg +11 -0
- package/src/icons/Tower.inline.svg +11 -0
- package/src/icons/Turbine.inline.svg +12 -0
- package/src/icons/duotone-icons/Clothes/Brassiere.svg +10 -0
- package/src/icons/duotone-icons/Clothes/Briefcase.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Cap.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Crown.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Dress.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Hanger.svg +10 -0
- package/src/icons/duotone-icons/Clothes/Hat.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Panties.svg +10 -0
- package/src/icons/duotone-icons/Clothes/Shirt.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Shoes.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Shorts.svg +10 -0
- package/src/icons/duotone-icons/Clothes/Sneakers.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Socks.svg +11 -0
- package/src/icons/duotone-icons/Clothes/Sun-glasses.svg +11 -0
- package/src/icons/duotone-icons/Clothes/T-Shirt.svg +10 -0
- package/src/icons/duotone-icons/Clothes/Tie.svg +11 -0
- package/src/icons/duotone-icons/Code/Backspace.svg +11 -0
- package/src/icons/duotone-icons/Code/CMD.svg +10 -0
- package/src/icons/duotone-icons/Code/Code.inline.svg +11 -0
- package/src/icons/duotone-icons/Code/Commit.svg +11 -0
- package/src/icons/duotone-icons/Code/Compiling.inline.svg +11 -0
- package/src/icons/duotone-icons/Code/Control.svg +10 -0
- package/src/icons/duotone-icons/Code/Done-circle.svg +11 -0
- package/src/icons/duotone-icons/Code/Error-circle.svg +11 -0
- package/src/icons/duotone-icons/Code/Git#1.svg +12 -0
- package/src/icons/duotone-icons/Code/Git#2.svg +15 -0
- package/src/icons/duotone-icons/Code/Git#3.svg +13 -0
- package/src/icons/duotone-icons/Code/Git#4.svg +13 -0
- package/src/icons/duotone-icons/Code/Github.svg +11 -0
- package/src/icons/duotone-icons/Code/Info-circle.svg +12 -0
- package/src/icons/duotone-icons/Code/Left-circle.svg +11 -0
- package/src/icons/duotone-icons/Code/Loading.svg +12 -0
- package/src/icons/duotone-icons/Code/Lock-circle.svg +11 -0
- package/src/icons/duotone-icons/Code/Lock-overturning.svg +11 -0
- package/src/icons/duotone-icons/Code/Minus.svg +11 -0
- package/src/icons/duotone-icons/Code/Option.svg +11 -0
- package/src/icons/duotone-icons/Code/Plus.svg +11 -0
- package/src/icons/duotone-icons/Code/Puzzle.svg +10 -0
- package/src/icons/duotone-icons/Code/Question-circle.svg +11 -0
- package/src/icons/duotone-icons/Code/Right-circle.svg +11 -0
- package/src/icons/duotone-icons/Code/Settings#4.svg +11 -0
- package/src/icons/duotone-icons/Code/Shift.svg +10 -0
- package/src/icons/duotone-icons/Code/Spy.svg +11 -0
- package/src/icons/duotone-icons/Code/Stop.svg +10 -0
- package/src/icons/duotone-icons/Code/Terminal.svg +11 -0
- package/src/icons/duotone-icons/Code/Thunder-circle.svg +11 -0
- package/src/icons/duotone-icons/Code/Time-schedule.svg +11 -0
- package/src/icons/duotone-icons/Code/Warning-1-circle.svg +12 -0
- package/src/icons/duotone-icons/Code/Warning-2.svg +12 -0
- package/src/icons/duotone-icons/Communication/Active-call.svg +11 -0
- package/src/icons/duotone-icons/Communication/Add-user.svg +11 -0
- package/src/icons/duotone-icons/Communication/Address-card.svg +10 -0
- package/src/icons/duotone-icons/Communication/Adress-book#1.svg +11 -0
- package/src/icons/duotone-icons/Communication/Adress-book#2.svg +11 -0
- package/src/icons/duotone-icons/Communication/Archive.svg +10 -0
- package/src/icons/duotone-icons/Communication/Call#1.svg +10 -0
- package/src/icons/duotone-icons/Communication/Call.svg +10 -0
- package/src/icons/duotone-icons/Communication/Chat#1.svg +11 -0
- package/src/icons/duotone-icons/Communication/Chat#2.svg +11 -0
- package/src/icons/duotone-icons/Communication/Chat#4.svg +10 -0
- package/src/icons/duotone-icons/Communication/Chat#5.svg +11 -0
- package/src/icons/duotone-icons/Communication/Chat#6.svg +11 -0
- package/src/icons/duotone-icons/Communication/Chat-check.svg +11 -0
- package/src/icons/duotone-icons/Communication/Chat-error.svg +11 -0
- package/src/icons/duotone-icons/Communication/Chat-locked.svg +11 -0
- package/src/icons/duotone-icons/Communication/Chat-smile.svg +11 -0
- package/src/icons/duotone-icons/Communication/Clipboard-check.svg +12 -0
- package/src/icons/duotone-icons/Communication/Clipboard-list.svg +17 -0
- package/src/icons/duotone-icons/Communication/Contact#1.svg +11 -0
- package/src/icons/duotone-icons/Communication/Delete-user.svg +11 -0
- package/src/icons/duotone-icons/Communication/Dial-numbers.svg +18 -0
- package/src/icons/duotone-icons/Communication/Flag.svg +11 -0
- package/src/icons/duotone-icons/Communication/Forward.svg +10 -0
- package/src/icons/duotone-icons/Communication/Group-chat.svg +11 -0
- package/src/icons/duotone-icons/Communication/Group.svg +11 -0
- package/src/icons/duotone-icons/Communication/Incoming-box.svg +12 -0
- package/src/icons/duotone-icons/Communication/Incoming-call.svg +11 -0
- package/src/icons/duotone-icons/Communication/Incoming-mail.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-@.svg +10 -0
- package/src/icons/duotone-icons/Communication/Mail-attachment.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-box.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-error.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-heart.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-locked.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-notification.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-opened.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail-unocked.svg +11 -0
- package/src/icons/duotone-icons/Communication/Mail.svg +10 -0
- package/src/icons/duotone-icons/Communication/Missed-call.svg +11 -0
- package/src/icons/duotone-icons/Communication/Outgoing-box.svg +12 -0
- package/src/icons/duotone-icons/Communication/Outgoing-call.svg +11 -0
- package/src/icons/duotone-icons/Communication/Outgoing-mail.svg +11 -0
- package/src/icons/duotone-icons/Communication/RSS.svg +12 -0
- package/src/icons/duotone-icons/Communication/Readed-mail.svg +11 -0
- package/src/icons/duotone-icons/Communication/Reply-all.svg +11 -0
- package/src/icons/duotone-icons/Communication/Reply.svg +10 -0
- package/src/icons/duotone-icons/Communication/Right.svg +10 -0
- package/src/icons/duotone-icons/Communication/Safe-chat.svg +11 -0
- package/src/icons/duotone-icons/Communication/Send.svg +10 -0
- package/src/icons/duotone-icons/Communication/Sending mail.svg +11 -0
- package/src/icons/duotone-icons/Communication/Sending.svg +11 -0
- package/src/icons/duotone-icons/Communication/Share.svg +11 -0
- package/src/icons/duotone-icons/Communication/Shield-thunder.svg +11 -0
- package/src/icons/duotone-icons/Communication/Shield-user.svg +12 -0
- package/src/icons/duotone-icons/Communication/Snoozed-mail.svg +11 -0
- package/src/icons/duotone-icons/Communication/Spam.svg +10 -0
- package/src/icons/duotone-icons/Communication/Thumbtack.svg +11 -0
- package/src/icons/duotone-icons/Communication/Urgent-mail.svg +11 -0
- package/src/icons/duotone-icons/Communication/Write.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Baking-glove.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Bowl.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Chef.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Cooking-book.svg +17 -0
- package/src/icons/duotone-icons/Cooking/Cooking-pot.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Cutting board.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Dinner.svg +14 -0
- package/src/icons/duotone-icons/Cooking/Dish.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Dishes.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Fork-spoon-knife.svg +15 -0
- package/src/icons/duotone-icons/Cooking/Fork-spoon.svg +13 -0
- package/src/icons/duotone-icons/Cooking/Fork.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Frying-pan.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Grater.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Kitchen-scale.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Knife#1.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Knife#2.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Knife&fork#1.svg +13 -0
- package/src/icons/duotone-icons/Cooking/Knife&fork#2.svg +13 -0
- package/src/icons/duotone-icons/Cooking/Ladle.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Rolling-pin.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Saucepan.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Shovel.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Sieve.svg +11 -0
- package/src/icons/duotone-icons/Cooking/Spoon.svg +12 -0
- package/src/icons/duotone-icons/Design/Adjust.svg +10 -0
- package/src/icons/duotone-icons/Design/Anchor-center-down.svg +14 -0
- package/src/icons/duotone-icons/Design/Anchor-center-up.svg +14 -0
- package/src/icons/duotone-icons/Design/Anchor-center.svg +11 -0
- package/src/icons/duotone-icons/Design/Anchor-left-down.svg +14 -0
- package/src/icons/duotone-icons/Design/Anchor-left-up.svg +14 -0
- package/src/icons/duotone-icons/Design/Anchor-left.svg +14 -0
- package/src/icons/duotone-icons/Design/Anchor-right-down.svg +14 -0
- package/src/icons/duotone-icons/Design/Anchor-right-up.svg +14 -0
- package/src/icons/duotone-icons/Design/Anchor-right.svg +14 -0
- package/src/icons/duotone-icons/Design/Arrows.svg +11 -0
- package/src/icons/duotone-icons/Design/Bezier-curve.svg +11 -0
- package/src/icons/duotone-icons/Design/Border.svg +10 -0
- package/src/icons/duotone-icons/Design/Brush.svg +11 -0
- package/src/icons/duotone-icons/Design/Bucket.svg +11 -0
- package/src/icons/duotone-icons/Design/Cap-1.svg +11 -0
- package/src/icons/duotone-icons/Design/Cap-2.svg +10 -0
- package/src/icons/duotone-icons/Design/Cap-3.svg +11 -0
- package/src/icons/duotone-icons/Design/Circle.svg +10 -0
- package/src/icons/duotone-icons/Design/Color-profile.svg +11 -0
- package/src/icons/duotone-icons/Design/Color.svg +10 -0
- package/src/icons/duotone-icons/Design/Component.svg +10 -0
- package/src/icons/duotone-icons/Design/Crop.svg +11 -0
- package/src/icons/duotone-icons/Design/Difference.svg +11 -0
- package/src/icons/duotone-icons/Design/Edit.svg +11 -0
- package/src/icons/duotone-icons/Design/Eraser.svg +10 -0
- package/src/icons/duotone-icons/Design/Flatten.svg +11 -0
- package/src/icons/duotone-icons/Design/Flip-horizontal.svg +12 -0
- package/src/icons/duotone-icons/Design/Flip-vertical.svg +12 -0
- package/src/icons/duotone-icons/Design/Horizontal.svg +11 -0
- package/src/icons/duotone-icons/Design/Image.svg +10 -0
- package/src/icons/duotone-icons/Design/Interselect.svg +11 -0
- package/src/icons/duotone-icons/Design/Join-1.svg +11 -0
- package/src/icons/duotone-icons/Design/Join-2.svg +11 -0
- package/src/icons/duotone-icons/Design/Join-3.svg +11 -0
- package/src/icons/duotone-icons/Design/Layers.svg +11 -0
- package/src/icons/duotone-icons/Design/Line.svg +12 -0
- package/src/icons/duotone-icons/Design/Magic.svg +11 -0
- package/src/icons/duotone-icons/Design/Mask.svg +11 -0
- package/src/icons/duotone-icons/Design/Patch.svg +12 -0
- package/src/icons/duotone-icons/Design/Pen&ruller.svg +11 -0
- package/src/icons/duotone-icons/Design/Pen-tool-vector.svg +11 -0
- package/src/icons/duotone-icons/Design/Pencil.svg +11 -0
- package/src/icons/duotone-icons/Design/Picker.svg +11 -0
- package/src/icons/duotone-icons/Design/Pixels.svg +15 -0
- package/src/icons/duotone-icons/Design/Polygon.svg +10 -0
- package/src/icons/duotone-icons/Design/Position.svg +10 -0
- package/src/icons/duotone-icons/Design/Rectangle.svg +10 -0
- package/src/icons/duotone-icons/Design/Saturation.svg +11 -0
- package/src/icons/duotone-icons/Design/Select.svg +11 -0
- package/src/icons/duotone-icons/Design/Sketch.svg +11 -0
- package/src/icons/duotone-icons/Design/Stamp.svg +11 -0
- package/src/icons/duotone-icons/Design/Substract.svg +11 -0
- package/src/icons/duotone-icons/Design/Target.svg +11 -0
- package/src/icons/duotone-icons/Design/Triangle.svg +10 -0
- package/src/icons/duotone-icons/Design/Union.svg +10 -0
- package/src/icons/duotone-icons/Design/Vertical.svg +11 -0
- package/src/icons/duotone-icons/Design/Zoom minus.svg +12 -0
- package/src/icons/duotone-icons/Design/Zoom plus.svg +12 -0
- package/src/icons/duotone-icons/Devices/Airpods.svg +13 -0
- package/src/icons/duotone-icons/Devices/Android.svg +11 -0
- package/src/icons/duotone-icons/Devices/Apple-Watch.svg +11 -0
- package/src/icons/duotone-icons/Devices/Battery-charging.svg +12 -0
- package/src/icons/duotone-icons/Devices/Battery-empty.svg +11 -0
- package/src/icons/duotone-icons/Devices/Battery-full.svg +11 -0
- package/src/icons/duotone-icons/Devices/Battery-half.svg +11 -0
- package/src/icons/duotone-icons/Devices/Bluetooth.svg +11 -0
- package/src/icons/duotone-icons/Devices/CPU#1.svg +17 -0
- package/src/icons/duotone-icons/Devices/CPU#2.svg +23 -0
- package/src/icons/duotone-icons/Devices/Camera.svg +12 -0
- package/src/icons/duotone-icons/Devices/Cardboard-vr.svg +11 -0
- package/src/icons/duotone-icons/Devices/Cassete.svg +12 -0
- package/src/icons/duotone-icons/Devices/Diagnostics.svg +12 -0
- package/src/icons/duotone-icons/Devices/Display#1.svg +11 -0
- package/src/icons/duotone-icons/Devices/Display#2.svg +12 -0
- package/src/icons/duotone-icons/Devices/Display#3.svg +12 -0
- package/src/icons/duotone-icons/Devices/Gameboy.svg +11 -0
- package/src/icons/duotone-icons/Devices/Gamepad#1.svg +11 -0
- package/src/icons/duotone-icons/Devices/Gamepad#2.svg +11 -0
- package/src/icons/duotone-icons/Devices/Generator.svg +13 -0
- package/src/icons/duotone-icons/Devices/Hard-drive.svg +11 -0
- package/src/icons/duotone-icons/Devices/Headphones.svg +11 -0
- package/src/icons/duotone-icons/Devices/Homepod.svg +11 -0
- package/src/icons/duotone-icons/Devices/Keyboard.svg +11 -0
- package/src/icons/duotone-icons/Devices/LTE#1.svg +11 -0
- package/src/icons/duotone-icons/Devices/LTE#2.svg +11 -0
- package/src/icons/duotone-icons/Devices/Laptop-macbook.svg +11 -0
- package/src/icons/duotone-icons/Devices/Laptop.svg +11 -0
- package/src/icons/duotone-icons/Devices/Mic.svg +11 -0
- package/src/icons/duotone-icons/Devices/Midi.svg +16 -0
- package/src/icons/duotone-icons/Devices/Mouse.svg +12 -0
- package/src/icons/duotone-icons/Devices/Phone.svg +12 -0
- package/src/icons/duotone-icons/Devices/Printer.svg +11 -0
- package/src/icons/duotone-icons/Devices/Radio.svg +14 -0
- package/src/icons/duotone-icons/Devices/Router#1.svg +11 -0
- package/src/icons/duotone-icons/Devices/Router#2.svg +11 -0
- package/src/icons/duotone-icons/Devices/SD-card.svg +10 -0
- package/src/icons/duotone-icons/Devices/Server.svg +12 -0
- package/src/icons/duotone-icons/Devices/Speaker.svg +11 -0
- package/src/icons/duotone-icons/Devices/TV#1.svg +12 -0
- package/src/icons/duotone-icons/Devices/TV#2.svg +11 -0
- package/src/icons/duotone-icons/Devices/Tablet.svg +11 -0
- package/src/icons/duotone-icons/Devices/USB.svg +12 -0
- package/src/icons/duotone-icons/Devices/Usb-storage.svg +11 -0
- package/src/icons/duotone-icons/Devices/Video-camera.svg +11 -0
- package/src/icons/duotone-icons/Devices/Watch#1.svg +13 -0
- package/src/icons/duotone-icons/Devices/Watch#2.svg +13 -0
- package/src/icons/duotone-icons/Devices/Wi-fi.svg +11 -0
- package/src/icons/duotone-icons/Devices/iMac.svg +12 -0
- package/src/icons/duotone-icons/Devices/iPhone-X.svg +11 -0
- package/src/icons/duotone-icons/Devices/iPhone-back.svg +10 -0
- package/src/icons/duotone-icons/Devices/iPhone-x-back.svg +10 -0
- package/src/icons/duotone-icons/Electric/Air-conditioning.svg +11 -0
- package/src/icons/duotone-icons/Electric/Blender.svg +10 -0
- package/src/icons/duotone-icons/Electric/Fan.svg +12 -0
- package/src/icons/duotone-icons/Electric/Fridge.svg +10 -0
- package/src/icons/duotone-icons/Electric/Gas-stove.svg +11 -0
- package/src/icons/duotone-icons/Electric/Hair-dryer.svg +11 -0
- package/src/icons/duotone-icons/Electric/Highvoltage.svg +10 -0
- package/src/icons/duotone-icons/Electric/Iron.svg +11 -0
- package/src/icons/duotone-icons/Electric/Kettle.svg +11 -0
- package/src/icons/duotone-icons/Electric/Mixer.svg +11 -0
- package/src/icons/duotone-icons/Electric/Outlet.svg +11 -0
- package/src/icons/duotone-icons/Electric/Range-hood.svg +11 -0
- package/src/icons/duotone-icons/Electric/Shutdown.svg +11 -0
- package/src/icons/duotone-icons/Electric/Socket-eu.svg +10 -0
- package/src/icons/duotone-icons/Electric/Socket-us.svg +10 -0
- package/src/icons/duotone-icons/Electric/Washer.svg +11 -0
- package/src/icons/duotone-icons/Files/Cloud-download.svg +11 -0
- package/src/icons/duotone-icons/Files/Cloud-upload.svg +11 -0
- package/src/icons/duotone-icons/Files/Compilation.svg +14 -0
- package/src/icons/duotone-icons/Files/Compiled-file.svg +14 -0
- package/src/icons/duotone-icons/Files/Deleted-file.svg +11 -0
- package/src/icons/duotone-icons/Files/Deleted-folder.svg +11 -0
- package/src/icons/duotone-icons/Files/Download.inline.svg +12 -0
- package/src/icons/duotone-icons/Files/Downloaded file.svg +11 -0
- package/src/icons/duotone-icons/Files/Downloads-folder.svg +11 -0
- package/src/icons/duotone-icons/Files/Export.svg +12 -0
- package/src/icons/duotone-icons/Files/File-cloud.svg +11 -0
- package/src/icons/duotone-icons/Files/File-done.svg +11 -0
- package/src/icons/duotone-icons/Files/File-minus.svg +11 -0
- package/src/icons/duotone-icons/Files/File-plus.svg +11 -0
- package/src/icons/duotone-icons/Files/File.svg +12 -0
- package/src/icons/duotone-icons/Files/Folder-check.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder-cloud.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder-error.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder-heart.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder-minus.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder-plus.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder-solid.svg +10 -0
- package/src/icons/duotone-icons/Files/Folder-star.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder-thunder.svg +11 -0
- package/src/icons/duotone-icons/Files/Folder.svg +10 -0
- package/src/icons/duotone-icons/Files/Group-folders.svg +11 -0
- package/src/icons/duotone-icons/Files/Import.svg +12 -0
- package/src/icons/duotone-icons/Files/Locked-folder.svg +11 -0
- package/src/icons/duotone-icons/Files/Media-folder.svg +11 -0
- package/src/icons/duotone-icons/Files/Media.svg +11 -0
- package/src/icons/duotone-icons/Files/Music.svg +11 -0
- package/src/icons/duotone-icons/Files/Pictures#1.svg +13 -0
- package/src/icons/duotone-icons/Files/Pictures#2.svg +15 -0
- package/src/icons/duotone-icons/Files/Protected-file.svg +11 -0
- package/src/icons/duotone-icons/Files/Selected-file.svg +11 -0
- package/src/icons/duotone-icons/Files/Share.svg +13 -0
- package/src/icons/duotone-icons/Files/Upload-folder.svg +11 -0
- package/src/icons/duotone-icons/Files/Upload.svg +12 -0
- package/src/icons/duotone-icons/Files/Uploaded-file.svg +11 -0
- package/src/icons/duotone-icons/Files/User-folder.svg +12 -0
- package/src/icons/duotone-icons/Food/Beer.svg +14 -0
- package/src/icons/duotone-icons/Food/Bottle#1.svg +11 -0
- package/src/icons/duotone-icons/Food/Bottle#2.svg +11 -0
- package/src/icons/duotone-icons/Food/Bread.svg +11 -0
- package/src/icons/duotone-icons/Food/Bucket.svg +11 -0
- package/src/icons/duotone-icons/Food/Burger.svg +12 -0
- package/src/icons/duotone-icons/Food/Cake.svg +12 -0
- package/src/icons/duotone-icons/Food/Carrot.svg +13 -0
- package/src/icons/duotone-icons/Food/Cheese.svg +11 -0
- package/src/icons/duotone-icons/Food/Chicken.svg +13 -0
- package/src/icons/duotone-icons/Food/Coffee#1.svg +14 -0
- package/src/icons/duotone-icons/Food/Coffee#2.svg +12 -0
- package/src/icons/duotone-icons/Food/Cookie.svg +13 -0
- package/src/icons/duotone-icons/Food/Dinner.svg +11 -0
- package/src/icons/duotone-icons/Food/Fish.svg +11 -0
- package/src/icons/duotone-icons/Food/French Bread.svg +10 -0
- package/src/icons/duotone-icons/Food/Glass-martini.svg +11 -0
- package/src/icons/duotone-icons/Food/Ice-cream#1.svg +11 -0
- package/src/icons/duotone-icons/Food/Ice-cream#2.svg +11 -0
- package/src/icons/duotone-icons/Food/Miso-soup.svg +11 -0
- package/src/icons/duotone-icons/Food/Orange.svg +11 -0
- package/src/icons/duotone-icons/Food/Pizza.svg +13 -0
- package/src/icons/duotone-icons/Food/Sushi.svg +11 -0
- package/src/icons/duotone-icons/Food/Two-bottles.svg +11 -0
- package/src/icons/duotone-icons/Food/Wine.svg +11 -0
- package/src/icons/duotone-icons/General/Attachment#1.svg +11 -0
- package/src/icons/duotone-icons/General/Attachment#2.svg +13 -0
- package/src/icons/duotone-icons/General/Binocular.svg +10 -0
- package/src/icons/duotone-icons/General/Bookmark.svg +10 -0
- package/src/icons/duotone-icons/General/Clip.svg +10 -0
- package/src/icons/duotone-icons/General/Clipboard.svg +13 -0
- package/src/icons/duotone-icons/General/Cursor.svg +10 -0
- package/src/icons/duotone-icons/General/Dislike.svg +11 -0
- package/src/icons/duotone-icons/General/Duplicate.svg +11 -0
- package/src/icons/duotone-icons/General/Edit.svg +10 -0
- package/src/icons/duotone-icons/General/Expand-arrows.svg +11 -0
- package/src/icons/duotone-icons/General/Fire.svg +10 -0
- package/src/icons/duotone-icons/General/Folder.svg +10 -0
- package/src/icons/duotone-icons/General/Half-heart.svg +11 -0
- package/src/icons/duotone-icons/General/Half-star.svg +11 -0
- package/src/icons/duotone-icons/General/Heart.svg +10 -0
- package/src/icons/duotone-icons/General/Hidden.svg +12 -0
- package/src/icons/duotone-icons/General/Like.svg +11 -0
- package/src/icons/duotone-icons/General/Lock.svg +16 -0
- package/src/icons/duotone-icons/General/Notification#2.svg +11 -0
- package/src/icons/duotone-icons/General/Notifications#1.svg +10 -0
- package/src/icons/duotone-icons/General/Other#1.svg +12 -0
- package/src/icons/duotone-icons/General/Other#2.svg +12 -0
- package/src/icons/duotone-icons/General/Sad.svg +11 -0
- package/src/icons/duotone-icons/General/Save.svg +11 -0
- package/src/icons/duotone-icons/General/Scale.svg +11 -0
- package/src/icons/duotone-icons/General/Scissors.svg +11 -0
- package/src/icons/duotone-icons/General/Search.svg +11 -0
- package/src/icons/duotone-icons/General/Settings#3.svg +11 -0
- package/src/icons/duotone-icons/General/Settings-1.inline.svg +11 -0
- package/src/icons/duotone-icons/General/Settings-2.svg +10 -0
- package/src/icons/duotone-icons/General/Shield-check.svg +11 -0
- package/src/icons/duotone-icons/General/Shield-disabled.svg +11 -0
- package/src/icons/duotone-icons/General/Shield-protected.svg +11 -0
- package/src/icons/duotone-icons/General/Size.svg +11 -0
- package/src/icons/duotone-icons/General/Smile.svg +11 -0
- package/src/icons/duotone-icons/General/Star.svg +10 -0
- package/src/icons/duotone-icons/General/Thunder-move.svg +11 -0
- package/src/icons/duotone-icons/General/Thunder.svg +10 -0
- package/src/icons/duotone-icons/General/Trash.svg +11 -0
- package/src/icons/duotone-icons/General/Unlock.svg +16 -0
- package/src/icons/duotone-icons/General/Update.svg +10 -0
- package/src/icons/duotone-icons/General/User.svg +11 -0
- package/src/icons/duotone-icons/General/Visible.svg +11 -0
- package/src/icons/duotone-icons/Home/Air-ballon.svg +11 -0
- package/src/icons/duotone-icons/Home/Alarm-clock.svg +12 -0
- package/src/icons/duotone-icons/Home/Armchair.svg +11 -0
- package/src/icons/duotone-icons/Home/Bag-chair.svg +11 -0
- package/src/icons/duotone-icons/Home/Bath.svg +11 -0
- package/src/icons/duotone-icons/Home/Bed.svg +12 -0
- package/src/icons/duotone-icons/Home/Book-open.svg +11 -0
- package/src/icons/duotone-icons/Home/Book.svg +16 -0
- package/src/icons/duotone-icons/Home/Box.svg +11 -0
- package/src/icons/duotone-icons/Home/Broom.svg +11 -0
- package/src/icons/duotone-icons/Home/Building.svg +12 -0
- package/src/icons/duotone-icons/Home/Bulb#1.svg +13 -0
- package/src/icons/duotone-icons/Home/Bulb#2.svg +13 -0
- package/src/icons/duotone-icons/Home/Chair#1.svg +11 -0
- package/src/icons/duotone-icons/Home/Chair#2.svg +11 -0
- package/src/icons/duotone-icons/Home/Clock.svg +11 -0
- package/src/icons/duotone-icons/Home/Commode#1.svg +11 -0
- package/src/icons/duotone-icons/Home/Commode#2.svg +11 -0
- package/src/icons/duotone-icons/Home/Couch.svg +11 -0
- package/src/icons/duotone-icons/Home/Cupboard.svg +11 -0
- package/src/icons/duotone-icons/Home/Curtains.svg +11 -0
- package/src/icons/duotone-icons/Home/Deer.svg +11 -0
- package/src/icons/duotone-icons/Home/Door-open.svg +11 -0
- package/src/icons/duotone-icons/Home/Earth.svg +11 -0
- package/src/icons/duotone-icons/Home/Fireplace.svg +11 -0
- package/src/icons/duotone-icons/Home/Flashlight.svg +11 -0
- package/src/icons/duotone-icons/Home/Flower#1.svg +13 -0
- package/src/icons/duotone-icons/Home/Flower#2.svg +14 -0
- package/src/icons/duotone-icons/Home/Flower#3.svg +12 -0
- package/src/icons/duotone-icons/Home/Globe.svg +11 -0
- package/src/icons/duotone-icons/Home/Home-heart.svg +11 -0
- package/src/icons/duotone-icons/Home/Home.svg +10 -0
- package/src/icons/duotone-icons/Home/Key.svg +11 -0
- package/src/icons/duotone-icons/Home/Ladder.svg +11 -0
- package/src/icons/duotone-icons/Home/Lamp#1.svg +13 -0
- package/src/icons/duotone-icons/Home/Lamp#2.svg +12 -0
- package/src/icons/duotone-icons/Home/Library.svg +11 -0
- package/src/icons/duotone-icons/Home/Mailbox.svg +11 -0
- package/src/icons/duotone-icons/Home/Mirror.svg +11 -0
- package/src/icons/duotone-icons/Home/Picture.svg +13 -0
- package/src/icons/duotone-icons/Home/Ruller.svg +10 -0
- package/src/icons/duotone-icons/Home/Stairs.svg +10 -0
- package/src/icons/duotone-icons/Home/Timer.svg +13 -0
- package/src/icons/duotone-icons/Home/Toilet.svg +11 -0
- package/src/icons/duotone-icons/Home/Towel.svg +10 -0
- package/src/icons/duotone-icons/Home/Trash.svg +11 -0
- package/src/icons/duotone-icons/Home/Water-mixer.svg +12 -0
- package/src/icons/duotone-icons/Home/Weight#1.svg +11 -0
- package/src/icons/duotone-icons/Home/Weight#2.svg +11 -0
- package/src/icons/duotone-icons/Home/Wood#1.svg +11 -0
- package/src/icons/duotone-icons/Home/Wood#2.svg +11 -0
- package/src/icons/duotone-icons/Home/Wood-horse.svg +10 -0
- package/src/icons/duotone-icons/Layout/Layout-3d.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-4-blocks.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-arrange.inline.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-grid.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-horizontal.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-left-panel-1.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-left-panel-2.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-right-panel-1.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-right-panel-2.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-top-panel-1.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-top-panel-2.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-top-panel-3.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-top-panel-4.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-top-panel-5.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-top-panel-6.svg +11 -0
- package/src/icons/duotone-icons/Layout/Layout-vertical.svg +11 -0
- package/src/icons/duotone-icons/Map/Compass.svg +10 -0
- package/src/icons/duotone-icons/Map/Direction#1.svg +10 -0
- package/src/icons/duotone-icons/Map/Direction#2.svg +10 -0
- package/src/icons/duotone-icons/Map/Location-arrow.svg +10 -0
- package/src/icons/duotone-icons/Map/Marker#1.svg +10 -0
- package/src/icons/duotone-icons/Map/Marker#2.svg +10 -0
- package/src/icons/duotone-icons/Map/Position.svg +12 -0
- package/src/icons/duotone-icons/Media/Add-music.svg +11 -0
- package/src/icons/duotone-icons/Media/Airplay-video.svg +11 -0
- package/src/icons/duotone-icons/Media/Airplay.svg +11 -0
- package/src/icons/duotone-icons/Media/Back.svg +11 -0
- package/src/icons/duotone-icons/Media/Backward.svg +11 -0
- package/src/icons/duotone-icons/Media/CD.svg +11 -0
- package/src/icons/duotone-icons/Media/DVD.svg +11 -0
- package/src/icons/duotone-icons/Media/Eject.svg +11 -0
- package/src/icons/duotone-icons/Media/Equalizer.svg +13 -0
- package/src/icons/duotone-icons/Media/Forward.svg +11 -0
- package/src/icons/duotone-icons/Media/Media-library#1.svg +13 -0
- package/src/icons/duotone-icons/Media/Media-library#2.svg +11 -0
- package/src/icons/duotone-icons/Media/Media-library#3.svg +17 -0
- package/src/icons/duotone-icons/Media/Movie-Lane #2.svg +11 -0
- package/src/icons/duotone-icons/Media/Movie-lane#1.svg +11 -0
- package/src/icons/duotone-icons/Media/Music-cloud.svg +11 -0
- package/src/icons/duotone-icons/Media/Music-note.svg +10 -0
- package/src/icons/duotone-icons/Media/Music.svg +10 -0
- package/src/icons/duotone-icons/Media/Mute.svg +11 -0
- package/src/icons/duotone-icons/Media/Next.svg +11 -0
- package/src/icons/duotone-icons/Media/Pause.svg +10 -0
- package/src/icons/duotone-icons/Media/Play.svg +10 -0
- package/src/icons/duotone-icons/Media/Playlist#1.svg +11 -0
- package/src/icons/duotone-icons/Media/Playlist#2.svg +11 -0
- package/src/icons/duotone-icons/Media/Rec.svg +10 -0
- package/src/icons/duotone-icons/Media/Repeat-one.svg +11 -0
- package/src/icons/duotone-icons/Media/Repeat.svg +11 -0
- package/src/icons/duotone-icons/Media/Shuffle.svg +11 -0
- package/src/icons/duotone-icons/Media/Volume-down.svg +11 -0
- package/src/icons/duotone-icons/Media/Volume-full.svg +11 -0
- package/src/icons/duotone-icons/Media/Volume-half.svg +11 -0
- package/src/icons/duotone-icons/Media/Volume-up.svg +11 -0
- package/src/icons/duotone-icons/Media/Vynil.svg +11 -0
- package/src/icons/duotone-icons/Media/Youtube.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Angle-double-down.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Angle-double-left.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Angle-double-right.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Angle-double-up.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Angle-down.svg +10 -0
- package/src/icons/duotone-icons/Navigation/Angle-left.svg +10 -0
- package/src/icons/duotone-icons/Navigation/Angle-right.svg +10 -0
- package/src/icons/duotone-icons/Navigation/Angle-up.svg +10 -0
- package/src/icons/duotone-icons/Navigation/Arrow-down.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Arrow-from-bottom.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-from-left.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-from-right.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-from-top.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-left.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Arrow-right.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Arrow-to-bottom.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-to-left.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-to-right.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-to-up.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrow-up.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Arrows-h.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Arrows-v.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Check.svg +10 -0
- package/src/icons/duotone-icons/Navigation/Close.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Double-check.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Down-2.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Down-left.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Down-right.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Exchange.svg +13 -0
- package/src/icons/duotone-icons/Navigation/Left 3.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Left-2.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Minus.svg +9 -0
- package/src/icons/duotone-icons/Navigation/Plus.svg +10 -0
- package/src/icons/duotone-icons/Navigation/Right 3.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Right-2.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Route.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Sign-in.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Sign-out.svg +12 -0
- package/src/icons/duotone-icons/Navigation/Up-2.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Up-down.svg +13 -0
- package/src/icons/duotone-icons/Navigation/Up-left.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Up-right.svg +11 -0
- package/src/icons/duotone-icons/Navigation/Waiting.svg +10 -0
- package/src/icons/duotone-icons/Shopping/ATM.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Bag#1.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Bag#2.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Barcode-read.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Barcode-scan.svg +12 -0
- package/src/icons/duotone-icons/Shopping/Barcode.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Bitcoin.svg +12 -0
- package/src/icons/duotone-icons/Shopping/Box#1.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Box#3.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Box2.inline.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Calculator.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Cart#1.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Cart#2.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Cart#3.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Chart-bar#1.svg +13 -0
- package/src/icons/duotone-icons/Shopping/Chart-bar#2.svg +13 -0
- package/src/icons/duotone-icons/Shopping/Chart-bar#3.svg +13 -0
- package/src/icons/duotone-icons/Shopping/Chart-line#1.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Chart-line#2.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Chart-pie.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Credit-card.svg +12 -0
- package/src/icons/duotone-icons/Shopping/Dollar.svg +12 -0
- package/src/icons/duotone-icons/Shopping/Euro.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Gift.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Loader.svg +12 -0
- package/src/icons/duotone-icons/Shopping/MC.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Money.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Pound.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Price #1.svg +10 -0
- package/src/icons/duotone-icons/Shopping/Price #2.svg +14 -0
- package/src/icons/duotone-icons/Shopping/Rouble.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Safe.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Sale#1.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Sale#2.svg +13 -0
- package/src/icons/duotone-icons/Shopping/Settings.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Sort#1.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Sort#2.svg +10 -0
- package/src/icons/duotone-icons/Shopping/Sort#3.svg +10 -0
- package/src/icons/duotone-icons/Shopping/Ticket.svg +10 -0
- package/src/icons/duotone-icons/Shopping/Wallet#2.svg +11 -0
- package/src/icons/duotone-icons/Shopping/Wallet#3.svg +12 -0
- package/src/icons/duotone-icons/Shopping/Wallet.svg +12 -0
- package/src/icons/duotone-icons/Text/Align-auto.svg +11 -0
- package/src/icons/duotone-icons/Text/Align-center.svg +11 -0
- package/src/icons/duotone-icons/Text/Align-justify.svg +11 -0
- package/src/icons/duotone-icons/Text/Align-left.svg +12 -0
- package/src/icons/duotone-icons/Text/Align-right.svg +11 -0
- package/src/icons/duotone-icons/Text/Article.svg +11 -0
- package/src/icons/duotone-icons/Text/Bold.svg +10 -0
- package/src/icons/duotone-icons/Text/Bullet-list.svg +11 -0
- package/src/icons/duotone-icons/Text/Code.svg +10 -0
- package/src/icons/duotone-icons/Text/Edit-text.svg +11 -0
- package/src/icons/duotone-icons/Text/Filter.svg +10 -0
- package/src/icons/duotone-icons/Text/Font.svg +11 -0
- package/src/icons/duotone-icons/Text/H1.svg +11 -0
- package/src/icons/duotone-icons/Text/H2.svg +11 -0
- package/src/icons/duotone-icons/Text/Itallic.svg +10 -0
- package/src/icons/duotone-icons/Text/Menu.svg +11 -0
- package/src/icons/duotone-icons/Text/Paragraph.svg +10 -0
- package/src/icons/duotone-icons/Text/Quote#1.svg +11 -0
- package/src/icons/duotone-icons/Text/Quote#2.svg +11 -0
- package/src/icons/duotone-icons/Text/Redo.svg +10 -0
- package/src/icons/duotone-icons/Text/Strikethrough.svg +11 -0
- package/src/icons/duotone-icons/Text/Text-height.svg +11 -0
- package/src/icons/duotone-icons/Text/Text-width.svg +11 -0
- package/src/icons/duotone-icons/Text/Text.svg +10 -0
- package/src/icons/duotone-icons/Text/Underline.svg +11 -0
- package/src/icons/duotone-icons/Text/Undo.svg +10 -0
- package/src/icons/duotone-icons/Tools/Angle Grinder.svg +12 -0
- package/src/icons/duotone-icons/Tools/Axe.svg +11 -0
- package/src/icons/duotone-icons/Tools/Brush.svg +11 -0
- package/src/icons/duotone-icons/Tools/Compass.svg +11 -0
- package/src/icons/duotone-icons/Tools/Hummer#2.svg +12 -0
- package/src/icons/duotone-icons/Tools/Hummer.svg +11 -0
- package/src/icons/duotone-icons/Tools/Pantone.svg +12 -0
- package/src/icons/duotone-icons/Tools/Road-Cone.svg +11 -0
- package/src/icons/duotone-icons/Tools/Roller.svg +12 -0
- package/src/icons/duotone-icons/Tools/Roulette.svg +11 -0
- package/src/icons/duotone-icons/Tools/Screwdriver.svg +11 -0
- package/src/icons/duotone-icons/Tools/Shovel.svg +11 -0
- package/src/icons/duotone-icons/Tools/Spatula.svg +11 -0
- package/src/icons/duotone-icons/Tools/Swiss-knife.svg +11 -0
- package/src/icons/duotone-icons/Tools/Tools.svg +11 -0
- package/src/icons/duotone-icons/Weather/Celcium.svg +11 -0
- package/src/icons/duotone-icons/Weather/Cloud#1.svg +10 -0
- package/src/icons/duotone-icons/Weather/Cloud#2.svg +11 -0
- package/src/icons/duotone-icons/Weather/Cloud-fog.svg +11 -0
- package/src/icons/duotone-icons/Weather/Cloud-sun.svg +11 -0
- package/src/icons/duotone-icons/Weather/Cloud-wind.svg +12 -0
- package/src/icons/duotone-icons/Weather/Cloudy-night.svg +11 -0
- package/src/icons/duotone-icons/Weather/Cloudy.svg +11 -0
- package/src/icons/duotone-icons/Weather/Day-rain.svg +11 -0
- package/src/icons/duotone-icons/Weather/Fahrenheit.svg +11 -0
- package/src/icons/duotone-icons/Weather/Fog.svg +15 -0
- package/src/icons/duotone-icons/Weather/Moon.svg +10 -0
- package/src/icons/duotone-icons/Weather/Night-fog.svg +11 -0
- package/src/icons/duotone-icons/Weather/Night-rain.svg +11 -0
- package/src/icons/duotone-icons/Weather/Rain#1.svg +11 -0
- package/src/icons/duotone-icons/Weather/Rain#2.svg +11 -0
- package/src/icons/duotone-icons/Weather/Rain#5.svg +11 -0
- package/src/icons/duotone-icons/Weather/Rainbow.svg +12 -0
- package/src/icons/duotone-icons/Weather/Snow#1.svg +11 -0
- package/src/icons/duotone-icons/Weather/Snow#2.svg +11 -0
- package/src/icons/duotone-icons/Weather/Snow#3.svg +11 -0
- package/src/icons/duotone-icons/Weather/Snow.svg +11 -0
- package/src/icons/duotone-icons/Weather/Storm.svg +11 -0
- package/src/icons/duotone-icons/Weather/Sun-fog.svg +11 -0
- package/src/icons/duotone-icons/Weather/Sun.svg +11 -0
- package/src/icons/duotone-icons/Weather/Suset#1.svg +11 -0
- package/src/icons/duotone-icons/Weather/Suset#2.svg +11 -0
- package/src/icons/duotone-icons/Weather/Temperature-empty.svg +10 -0
- package/src/icons/duotone-icons/Weather/Temperature-full.svg +10 -0
- package/src/icons/duotone-icons/Weather/Temperature-half.svg +10 -0
- package/src/icons/duotone-icons/Weather/Thunder-night.svg +11 -0
- package/src/icons/duotone-icons/Weather/Thunder.svg +11 -0
- package/src/icons/duotone-icons/Weather/Umbrella.svg +11 -0
- package/src/icons/duotone-icons/Weather/Wind.svg +11 -0
- package/src/icons/social/facebook.svg +10 -0
- package/src/icons/social/instagram.svg +10 -0
- package/src/icons/social/pinterest.svg +3 -0
- package/src/icons/social/twitter.svg +10 -0
- package/src/implemented-proposals/abi-management.md +161 -0
- package/src/implemented-proposals/bank-timestamp-correction.md +77 -0
- package/src/implemented-proposals/commitment.md +92 -0
- package/src/implemented-proposals/durable-tx-nonces.md +131 -0
- package/src/implemented-proposals/ed_overview/ed_economic_sustainability.md +9 -0
- package/src/implemented-proposals/ed_overview/ed_mvp.md +24 -0
- package/src/implemented-proposals/ed_overview/ed_overview.md +19 -0
- package/src/implemented-proposals/ed_overview/ed_references.md +7 -0
- package/src/implemented-proposals/ed_overview/ed_storage_rent_economics.md +17 -0
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_overview.md +9 -0
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_protocol_based_rewards.md +64 -0
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_transaction_fees.md +20 -0
- package/src/implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_validation_stake_delegation.md +28 -0
- package/src/implemented-proposals/implemented-proposals.md +9 -0
- package/src/implemented-proposals/installer.md +216 -0
- package/src/implemented-proposals/instruction_introspection.md +28 -0
- package/src/implemented-proposals/leader-leader-transition.md +55 -0
- package/src/implemented-proposals/leader-validator-transition.md +52 -0
- package/src/implemented-proposals/persistent-account-storage.md +83 -0
- package/src/implemented-proposals/readonly-accounts.md +25 -0
- package/src/implemented-proposals/reliable-vote-transmission.md +60 -0
- package/src/implemented-proposals/rent.md +69 -0
- package/src/implemented-proposals/repair-service.md +108 -0
- package/src/implemented-proposals/rpc-transaction-history.md +107 -0
- package/src/implemented-proposals/snapshot-verification.md +56 -0
- package/src/implemented-proposals/staking-rewards.md +33 -0
- package/src/implemented-proposals/testing-programs.md +53 -0
- package/src/implemented-proposals/tower-bft.md +138 -0
- package/src/implemented-proposals/transaction-fees.md +32 -0
- package/src/implemented-proposals/validator-timestamp-oracle.md +107 -0
- package/src/inflation/adjusted_staking_yield.md +118 -0
- package/src/inflation/inflation_schedule.md +40 -0
- package/src/inflation/terminology.md +54 -0
- package/src/integrations/exchange.md +753 -0
- package/src/introduction.md +33 -0
- package/src/offline-signing/durable-nonce.md +247 -0
- package/src/offline-signing.md +174 -0
- package/src/pages/index.js +160 -0
- package/src/pages/styles.module.css +41 -0
- package/src/proposals/accepted-design-proposals.md +11 -0
- package/src/proposals/accounts-db-replication.md +185 -0
- package/src/proposals/bankless-leader.md +57 -0
- package/src/proposals/block-confirmation.md +85 -0
- package/src/proposals/cluster-test-framework.md +102 -0
- package/src/proposals/comprehensive-compute-fees.md +164 -0
- package/src/proposals/embedding-move.md +37 -0
- package/src/proposals/interchain-transaction-verification.md +105 -0
- package/src/proposals/ledger-replication-to-implement.md +417 -0
- package/src/proposals/log_data.md +146 -0
- package/src/proposals/optimistic-confirmation-and-slashing.md +89 -0
- package/src/proposals/optimistic-transaction-propagation-signal.md +109 -0
- package/src/proposals/optimistic_confirmation.md +408 -0
- package/src/proposals/program-instruction-macro.md +226 -0
- package/src/proposals/return-data.md +144 -0
- package/src/proposals/rip-curl.md +56 -0
- package/src/proposals/rust-clients.md +54 -0
- package/src/proposals/simple-payment-and-state-verification.md +258 -0
- package/src/proposals/slashing.md +60 -0
- package/src/proposals/snapshot-verification.md +11 -0
- package/src/proposals/tick-verification.md +70 -0
- package/src/proposals/transactions-v2.md +334 -0
- package/src/proposals/validator-proposal.md +54 -0
- package/src/proposals/vote-signing-to-implement.md +116 -0
- package/src/running-validator/restart-cluster.md +117 -0
- package/src/running-validator/validator-failover.md +146 -0
- package/src/running-validator/validator-info.md +64 -0
- package/src/running-validator/validator-monitor.md +47 -0
- package/src/running-validator/validator-reqs.md +115 -0
- package/src/running-validator/validator-stake.md +132 -0
- package/src/running-validator/validator-start.md +492 -0
- package/src/running-validator/validator-troubleshoot.md +17 -0
- package/src/running-validator/vote-accounts.md +219 -0
- package/src/running-validator.md +7 -0
- package/src/staking/stake-accounts.md +141 -0
- package/src/staking/stake-programming.md +27 -0
- package/src/staking.md +117 -0
- package/src/storage_rent_economics.md +17 -0
- package/src/terminology.md +346 -0
- package/src/theme/Footer/index.js +126 -0
- package/src/theme/Footer/styles.module.css +15 -0
- package/src/transaction_fees.md +21 -0
- package/src/validator/anatomy.md +13 -0
- package/src/validator/blockstore.md +91 -0
- package/src/validator/gossip.md +90 -0
- package/src/validator/runtime.md +69 -0
- package/src/validator/tpu.md +5 -0
- package/src/validator/tvu.md +9 -0
- package/src/wallet-guide/apps.md +74 -0
- package/src/wallet-guide/cli.md +67 -0
- package/src/wallet-guide/file-system-wallet.md +65 -0
- package/src/wallet-guide/hardware-wallets/ledger.md +219 -0
- package/src/wallet-guide/hardware-wallets.md +53 -0
- package/src/wallet-guide/ledger-live.md +77 -0
- package/src/wallet-guide/paper-wallet.md +203 -0
- package/src/wallet-guide/solflare.md +201 -0
- package/src/wallet-guide/support.md +16 -0
- package/src/wallet-guide/web-wallets.md +52 -0
- package/src/wallet-guide.md +63 -0
- package/static/.nojekyll +0 -0
- package/static/img/favicon.ico +0 -0
- package/static/katex/README.md +91 -0
- package/static/katex/contrib/auto-render.js +350 -0
- package/static/katex/contrib/auto-render.min.js +1 -0
- package/static/katex/contrib/auto-render.mjs +226 -0
- package/static/katex/contrib/copy-tex.css +13 -0
- package/static/katex/contrib/copy-tex.js +213 -0
- package/static/katex/contrib/copy-tex.min.css +1 -0
- package/static/katex/contrib/copy-tex.min.js +1 -0
- package/static/katex/contrib/copy-tex.mjs +85 -0
- package/static/katex/contrib/mathtex-script-type.js +137 -0
- package/static/katex/contrib/mathtex-script-type.min.js +1 -0
- package/static/katex/contrib/mathtex-script-type.mjs +24 -0
- package/static/katex/contrib/mhchem.js +3241 -0
- package/static/katex/contrib/mhchem.min.js +1 -0
- package/static/katex/contrib/mhchem.mjs +3109 -0
- package/static/katex/contrib/render-a11y-string.js +870 -0
- package/static/katex/contrib/render-a11y-string.min.js +1 -0
- package/static/katex/contrib/render-a11y-string.mjs +753 -0
- package/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
- package/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/static/katex/katex.css +1034 -0
- package/static/katex/katex.js +17308 -0
- package/static/katex/katex.min.css +1 -0
- package/static/katex/katex.min.js +1 -0
- package/static/katex/katex.mjs +16911 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Cluster Software Installation and Updates
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Currently users are required to build the solana cluster software themselves from the git repository and manually update it, which is error prone and inconvenient.
|
|
6
|
+
|
|
7
|
+
This document proposes an easy to use software install and updater that can be used to deploy pre-built binaries for supported platforms. Users may elect to use binaries supplied by Solana or any other party provider. Deployment of updates is managed using an on-chain update manifest program.
|
|
8
|
+
|
|
9
|
+
## Motivating Examples
|
|
10
|
+
|
|
11
|
+
### Fetch and run a pre-built installer using a bootstrap curl/shell script
|
|
12
|
+
|
|
13
|
+
The easiest install method for supported platforms:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/solana-install-init.sh | sh
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This script will check github for the latest tagged release and download and run the `solana-install-init` binary from there.
|
|
20
|
+
|
|
21
|
+
If additional arguments need to be specified during the installation, the following shell syntax is used:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
$ init_args=.... # arguments for `solana-install-init ...`
|
|
25
|
+
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/solana-install-init.sh | sh -s - ${init_args}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Fetch and run a pre-built installer from a Github release
|
|
29
|
+
|
|
30
|
+
With a well-known release URL, a pre-built binary can be obtained for supported platforms:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
$ curl -o solana-install-init https://github.com/solana-labs/solana/releases/download/v1.0.0/solana-install-init-x86_64-apple-darwin
|
|
34
|
+
$ chmod +x ./solana-install-init
|
|
35
|
+
$ ./solana-install-init --help
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Build and run the installer from source
|
|
39
|
+
|
|
40
|
+
If a pre-built binary is not available for a given platform, building the installer from source is always an option:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
$ git clone https://github.com/solana-labs/solana.git
|
|
44
|
+
$ cd solana/install
|
|
45
|
+
$ cargo run -- --help
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Deploy a new update to a cluster
|
|
49
|
+
|
|
50
|
+
Given a solana release tarball \(as created by `ci/publish-tarball.sh`\) that has already been uploaded to a publicly accessible URL, the following commands will deploy the update:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
$ solana-keygen new -o update-manifest.json # <-- only generated once, the public key is shared with users
|
|
54
|
+
$ solana-install deploy http://example.com/path/to/solana-release.tar.bz2 update-manifest.json
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Run a validator node that auto updates itself
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
$ solana-install init --pubkey 92DMonmBYXwEMHJ99c9ceRSpAmk9v6i3RdvDdXaVcrfj # <-- pubkey is obtained from whoever is deploying the updates
|
|
61
|
+
$ export PATH=~/.local/share/solana-install/bin:$PATH
|
|
62
|
+
$ solana-keygen ... # <-- runs the latest solana-keygen
|
|
63
|
+
$ solana-install run solana-validator ... # <-- runs a validator, restarting it as necesary when an update is applied
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## On-chain Update Manifest
|
|
67
|
+
|
|
68
|
+
An update manifest is used to advertise the deployment of new release tarballs on a solana cluster. The update manifest is stored using the `config` program, and each update manifest account describes a logical update channel for a given target triple \(eg, `x86_64-apple-darwin`\). The account public key is well-known between the entity deploying new updates and users consuming those updates.
|
|
69
|
+
|
|
70
|
+
The update tarball itself is hosted elsewhere, off-chain and can be fetched from the specified `download_url`.
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
use solana_sdk::signature::Signature;
|
|
74
|
+
|
|
75
|
+
/// Information required to download and apply a given update
|
|
76
|
+
pub struct UpdateManifest {
|
|
77
|
+
pub timestamp_secs: u64, // When the release was deployed in seconds since UNIX EPOCH
|
|
78
|
+
pub download_url: String, // Download URL to the release tar.bz2
|
|
79
|
+
pub download_sha256: String, // SHA256 digest of the release tar.bz2 file
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// Data of an Update Manifest program Account.
|
|
83
|
+
#[derive(Serialize, Deserialize, Default, Debug, PartialEq)]
|
|
84
|
+
pub struct SignedUpdateManifest {
|
|
85
|
+
pub manifest: UpdateManifest,
|
|
86
|
+
pub manifest_signature: Signature,
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Note that the `manifest` field itself contains a corresponding signature \(`manifest_signature`\) to guard against man-in-the-middle attacks between the `solana-install` tool and the solana cluster RPC API.
|
|
91
|
+
|
|
92
|
+
To guard against rollback attacks, `solana-install` will refuse to install an update with an older `timestamp_secs` than what is currently installed.
|
|
93
|
+
|
|
94
|
+
## Release Archive Contents
|
|
95
|
+
|
|
96
|
+
A release archive is expected to be a tar file compressed with bzip2 with the following internal structure:
|
|
97
|
+
|
|
98
|
+
- `/version.yml` - a simple YAML file containing the field `"target"` - the
|
|
99
|
+
|
|
100
|
+
target tuple. Any additional fields are ignored.
|
|
101
|
+
|
|
102
|
+
- `/bin/` -- directory containing available programs in the release.
|
|
103
|
+
|
|
104
|
+
`solana-install` will symlink this directory to
|
|
105
|
+
|
|
106
|
+
`~/.local/share/solana-install/bin` for use by the `PATH` environment
|
|
107
|
+
|
|
108
|
+
variable.
|
|
109
|
+
|
|
110
|
+
- `...` -- any additional files and directories are permitted
|
|
111
|
+
|
|
112
|
+
## solana-install Tool
|
|
113
|
+
|
|
114
|
+
The `solana-install` tool is used by the user to install and update their cluster software.
|
|
115
|
+
|
|
116
|
+
It manages the following files and directories in the user's home directory:
|
|
117
|
+
|
|
118
|
+
- `~/.config/solana/install/config.yml` - user configuration and information about currently installed software version
|
|
119
|
+
- `~/.local/share/solana/install/bin` - a symlink to the current release. eg, `~/.local/share/solana-update/<update-pubkey>-<manifest_signature>/bin`
|
|
120
|
+
- `~/.local/share/solana/install/releases/<download_sha256>/` - contents of a release
|
|
121
|
+
|
|
122
|
+
### Command-line Interface
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
solana-install 0.16.0
|
|
126
|
+
The solana cluster software installer
|
|
127
|
+
|
|
128
|
+
USAGE:
|
|
129
|
+
solana-install [OPTIONS] <SUBCOMMAND>
|
|
130
|
+
|
|
131
|
+
FLAGS:
|
|
132
|
+
-h, --help Prints help information
|
|
133
|
+
-V, --version Prints version information
|
|
134
|
+
|
|
135
|
+
OPTIONS:
|
|
136
|
+
-c, --config <PATH> Configuration file to use [default: .../Library/Preferences/solana/install.yml]
|
|
137
|
+
|
|
138
|
+
SUBCOMMANDS:
|
|
139
|
+
deploy deploys a new update
|
|
140
|
+
help Prints this message or the help of the given subcommand(s)
|
|
141
|
+
info displays information about the current installation
|
|
142
|
+
init initializes a new installation
|
|
143
|
+
run Runs a program while periodically checking and applying software updates
|
|
144
|
+
update checks for an update, and if available downloads and applies it
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
solana-install-init
|
|
149
|
+
initializes a new installation
|
|
150
|
+
|
|
151
|
+
USAGE:
|
|
152
|
+
solana-install init [OPTIONS]
|
|
153
|
+
|
|
154
|
+
FLAGS:
|
|
155
|
+
-h, --help Prints help information
|
|
156
|
+
|
|
157
|
+
OPTIONS:
|
|
158
|
+
-d, --data_dir <PATH> Directory to store install data [default: .../Library/Application Support/solana]
|
|
159
|
+
-u, --url <URL> JSON RPC URL for the solana cluster [default: http://api.devnet.solana.com]
|
|
160
|
+
-p, --pubkey <PUBKEY> Public key of the update manifest [default: 9XX329sPuskWhH4DQh6k16c87dHKhXLBZTL3Gxmve8Gp]
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
solana-install info
|
|
165
|
+
displays information about the current installation
|
|
166
|
+
|
|
167
|
+
USAGE:
|
|
168
|
+
solana-install info [FLAGS]
|
|
169
|
+
|
|
170
|
+
FLAGS:
|
|
171
|
+
-h, --help Prints help information
|
|
172
|
+
-l, --local only display local information, don't check the cluster for new updates
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
solana-install deploy
|
|
177
|
+
deploys a new update
|
|
178
|
+
|
|
179
|
+
USAGE:
|
|
180
|
+
solana-install deploy <download_url> <update_manifest_keypair>
|
|
181
|
+
|
|
182
|
+
FLAGS:
|
|
183
|
+
-h, --help Prints help information
|
|
184
|
+
|
|
185
|
+
ARGS:
|
|
186
|
+
<download_url> URL to the solana release archive
|
|
187
|
+
<update_manifest_keypair> Keypair file for the update manifest (/path/to/keypair.json)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```text
|
|
191
|
+
solana-install update
|
|
192
|
+
checks for an update, and if available downloads and applies it
|
|
193
|
+
|
|
194
|
+
USAGE:
|
|
195
|
+
solana-install update
|
|
196
|
+
|
|
197
|
+
FLAGS:
|
|
198
|
+
-h, --help Prints help information
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
```text
|
|
202
|
+
solana-install run
|
|
203
|
+
Runs a program while periodically checking and applying software updates
|
|
204
|
+
|
|
205
|
+
USAGE:
|
|
206
|
+
solana-install run <program_name> [program_arguments]...
|
|
207
|
+
|
|
208
|
+
FLAGS:
|
|
209
|
+
-h, --help Prints help information
|
|
210
|
+
|
|
211
|
+
ARGS:
|
|
212
|
+
<program_name> program to run
|
|
213
|
+
<program_arguments>... arguments to supply to the program
|
|
214
|
+
|
|
215
|
+
The program will be restarted upon a successful software update
|
|
216
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: instruction introspection
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Problem
|
|
6
|
+
|
|
7
|
+
Some smart contract programs may want to verify that another Instruction is present in a
|
|
8
|
+
given Message since that Instruction could be be performing a verification of certain data,
|
|
9
|
+
in a precompiled function. (See secp256k1_instruction for an example).
|
|
10
|
+
|
|
11
|
+
## Solution
|
|
12
|
+
|
|
13
|
+
Add a new sysvar Sysvar1nstructions1111111111111111111111111 that a program can reference
|
|
14
|
+
and received the Message's instruction data inside, and also the index of the current instruction.
|
|
15
|
+
|
|
16
|
+
Two helper functions to extract this data can be used:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
fn load_current_index(instruction_data: &[u8]) -> u16;
|
|
20
|
+
fn load_instruction_at(instruction_index: usize, instruction_data: &[u8]) -> Result<Instruction>;
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The runtime will recognize this special instruction, serialize the Message instruction data
|
|
24
|
+
for it and also write the current instruction index and then the bpf program can extract the
|
|
25
|
+
necessary information from there.
|
|
26
|
+
|
|
27
|
+
Note: custom serialization of instructions is used because bincode is about 10x slower
|
|
28
|
+
in native code and exceeds current BPF instruction limits.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Leader-to-Leader Transition
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
This design describes how leaders transition production of the PoH ledger between each other as each leader generates its own slot.
|
|
6
|
+
|
|
7
|
+
## Challenges
|
|
8
|
+
|
|
9
|
+
Current leader and the next leader are both racing to generate the final tick for the current slot. The next leader may arrive at that slot while still processing the current leader's entries.
|
|
10
|
+
|
|
11
|
+
The ideal scenario would be that the next leader generated its own slot right after it was able to vote for the current leader. It is very likely that the next leader will arrive at their PoH slot height before the current leader finishes broadcasting the entire block.
|
|
12
|
+
|
|
13
|
+
The next leader has to make the decision of attaching its own block to the last completed block, or wait to finalize the pending block. It is possible that the next leader will produce a block that proposes that the current leader failed, even though the rest of the network observes that block succeeding.
|
|
14
|
+
|
|
15
|
+
The current leader has incentives to start its slot as early as possible to capture economic rewards. Those incentives need to be balanced by the leader's need to attach its block to a block that has the most commitment from the rest of the network.
|
|
16
|
+
|
|
17
|
+
## Leader timeout
|
|
18
|
+
|
|
19
|
+
While a leader is actively receiving entries for the previous slot, the leader can delay broadcasting the start of its block in real time. The delay is locally configurable by each leader, and can be dynamically based on the previous leader's behavior. If the previous leader's block is confirmed by the leader's TVU before the timeout, the PoH is reset to the start of the slot and this leader produces its block immediately.
|
|
20
|
+
|
|
21
|
+
The downsides:
|
|
22
|
+
|
|
23
|
+
- Leader delays its own slot, potentially allowing the next leader more time to
|
|
24
|
+
|
|
25
|
+
catch up.
|
|
26
|
+
|
|
27
|
+
The upsides compared to guards:
|
|
28
|
+
|
|
29
|
+
- All the space in a block is used for entries.
|
|
30
|
+
- The timeout is not fixed.
|
|
31
|
+
- The timeout is local to the leader, and therefore can be clever. The leader's heuristic can take into account turbine performance.
|
|
32
|
+
- This design doesn't require a ledger hard fork to update.
|
|
33
|
+
- The previous leader can redundantly transmit the last entry in the block to the next leader, and the next leader can speculatively decide to trust it to generate its block without verification of the previous block.
|
|
34
|
+
- The leader can speculatively generate the last tick from the last received entry.
|
|
35
|
+
- The leader can speculatively process transactions and guess which ones are not going to be encoded by the previous leader. This is also a censorship attack vector. The current leader may withhold transactions that it receives from the clients so it can encode them into its own slot. Once processed, entries can be replayed into PoH quickly.
|
|
36
|
+
|
|
37
|
+
## Alternative design options
|
|
38
|
+
|
|
39
|
+
### Guard tick at the end of the slot
|
|
40
|
+
|
|
41
|
+
A leader does not produce entries in its block after the _penultimate tick_, which is the last tick before the first tick of the next slot. The network votes on the _last tick_, so the time difference between the _penultimate tick_ and the _last tick_ is the forced delay for the entire network, as well as the next leader before a new slot can be generated. The network can produce the _last tick_ from the _penultimate tick_.
|
|
42
|
+
|
|
43
|
+
If the next leader receives the _penultimate tick_ before it produces its own _first tick_, it will reset its PoH and produce the _first tick_ from the previous leader's _penultimate tick_. The rest of the network will also reset its PoH to produce the _last tick_ as the id to vote on.
|
|
44
|
+
|
|
45
|
+
The downsides:
|
|
46
|
+
|
|
47
|
+
- Every vote, and therefore confirmation, is delayed by a fixed timeout. 1 tick, or around 100ms.
|
|
48
|
+
- Average case confirmation time for a transaction would be at least 50ms worse.
|
|
49
|
+
- It is part of the ledger definition, so to change this behavior would require a hard fork.
|
|
50
|
+
- Not all the available space is used for entries.
|
|
51
|
+
|
|
52
|
+
The upsides compared to leader timeout:
|
|
53
|
+
|
|
54
|
+
- The next leader has received all the previous entries, so it can start processing transactions without recording them into PoH.
|
|
55
|
+
- The previous leader can redundantly transmit the last entry containing the _penultimate tick_ to the next leader. The next leader can speculatively generate the _last tick_ as soon as it receives the _penultimate tick_, even before verifying it.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Leader-to-Validator Transition
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
A validator typically spends its time validating blocks. If, however, a staker delegates its stake to a validator, it will occasionally be selected as a _slot leader_. As a slot leader, the validator is responsible for producing blocks during an assigned _slot_. A slot has a duration of some number of preconfigured _ticks_. The duration of those ticks are estimated with a _PoH Recorder_ described later in this document.
|
|
6
|
+
|
|
7
|
+
## BankFork
|
|
8
|
+
|
|
9
|
+
BankFork tracks changes to the bank state over a specific slot. Once the final tick has been registered the state is frozen. Any attempts to write to are rejected.
|
|
10
|
+
|
|
11
|
+
## Validator
|
|
12
|
+
|
|
13
|
+
A validator operates on many different concurrent forks of the bank state until it generates a PoH hash with a height within its leader slot.
|
|
14
|
+
|
|
15
|
+
## Slot Leader
|
|
16
|
+
|
|
17
|
+
A slot leader builds blocks on top of only one fork, the one it last voted on.
|
|
18
|
+
|
|
19
|
+
## PoH Recorder
|
|
20
|
+
|
|
21
|
+
Slot leaders and validators use a PoH Recorder for both estimating slot height and for recording transactions.
|
|
22
|
+
|
|
23
|
+
### PoH Recorder when Validating
|
|
24
|
+
|
|
25
|
+
The PoH Recorder acts as a simple VDF when validating. It tells the validator when it needs to switch to the slot leader role. Every time the validator votes on a fork, it should use the fork's latest [blockhash](../terminology.md#blockhash) to re-seed the VDF. Re-seeding solves two problems. First, it synchronizes its VDF to the leader's, allowing it to more accurately determine when its leader slot begins. Second, if the previous leader goes down, all wallclock time is accounted for in the next leader's PoH stream. For example, if one block is missing when the leader starts, the block it produces should have a PoH duration of two blocks. The longer duration ensures the following leader isn't attempting to snip all the transactions from the previous leader's slot.
|
|
26
|
+
|
|
27
|
+
### PoH Recorder when Leading
|
|
28
|
+
|
|
29
|
+
A slot leader use the PoH Recorder to record transactions, locking their positions in time. The PoH hash must be derived from a previous leader's last block. If it isn't, its block will fail PoH verification and be rejected by the cluster.
|
|
30
|
+
|
|
31
|
+
The PoH Recorder also serves to inform the slot leader when its slot is over. The leader needs to take care not to modify its bank if recording the transaction would generate a PoH height outside its designated slot. The leader, therefore, should not commit account changes until after it generates the entry's PoH hash. When the PoH height falls outside its slot any transactions in its pipeline may be dropped or forwarded to the next leader. Forwarding is preferred, as it would minimize network congestion, allowing the cluster to advertise higher TPS capacity.
|
|
32
|
+
|
|
33
|
+
## Validator Loop
|
|
34
|
+
|
|
35
|
+
The PoH Recorder manages the transition between modes. Once a ledger is replayed, the validator can run until the recorder indicates it should be the slot leader. As a slot leader, the node can then execute and record transactions.
|
|
36
|
+
|
|
37
|
+
The loop is synchronized to PoH and does a synchronous start and stop of the slot leader functionality. After stopping, the validator's TVU should find itself in the same state as if a different leader had sent it the same block. The following is pseudocode for the loop:
|
|
38
|
+
|
|
39
|
+
1. Query the LeaderScheduler for the next assigned slot.
|
|
40
|
+
2. Run the TVU over all the forks. 1. TVU will send votes to what it believes is the "best" fork. 2. After each vote, restart the PoH Recorder to run until the next assigned
|
|
41
|
+
|
|
42
|
+
slot.
|
|
43
|
+
|
|
44
|
+
3. When time to be a slot leader, start the TPU. Point it to the last fork the
|
|
45
|
+
|
|
46
|
+
TVU voted on.
|
|
47
|
+
|
|
48
|
+
4. Produce entries until the end of the slot. 1. For the duration of the slot, the TVU must not vote on other forks. 2. After the slot ends, the TPU freezes its BankFork. After freezing,
|
|
49
|
+
|
|
50
|
+
the TVU may resume voting.
|
|
51
|
+
|
|
52
|
+
5. Goto 1.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Persistent Account Storage
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Persistent Account Storage
|
|
6
|
+
|
|
7
|
+
The set of accounts represent the current computed state of all the transactions that have been processed by a validator. Each validator needs to maintain this entire set. Each block that is proposed by the network represents a change to this set, and since each block is a potential rollback point, the changes need to be reversible.
|
|
8
|
+
|
|
9
|
+
Persistent storage like NVMEs are 20 to 40 times cheaper than DDR. The problem with persistent storage is that write and read performance is much slower than DDR. Care must be taken in how data is read or written to. Both reads and writes can be split between multiple storage drives and accessed in parallel. This design proposes a data structure that allows for concurrent reads and concurrent writes of storage. Writes are optimized by using an AppendVec data structure, which allows a single writer to append while allowing access to many concurrent readers. The accounts index maintains a pointer to a spot where the account was appended to every fork, thus removing the need for explicit checkpointing of state.
|
|
10
|
+
|
|
11
|
+
## AppendVec
|
|
12
|
+
|
|
13
|
+
AppendVec is a data structure that allows for random reads concurrent with a single append-only writer. Growing or resizing the capacity of the AppendVec requires exclusive access. This is implemented with an atomic `offset`, which is updated at the end of a completed append.
|
|
14
|
+
|
|
15
|
+
The underlying memory for an AppendVec is a memory-mapped file. Memory-mapped files allow for fast random access and paging is handled by the OS.
|
|
16
|
+
|
|
17
|
+
## Account Index
|
|
18
|
+
|
|
19
|
+
The account index is designed to support a single index for all the currently forked Accounts.
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
type AppendVecId = usize;
|
|
23
|
+
|
|
24
|
+
type Fork = u64;
|
|
25
|
+
|
|
26
|
+
struct AccountMap(Hashmap<Fork, (AppendVecId, u64)>);
|
|
27
|
+
|
|
28
|
+
type AccountIndex = HashMap<Pubkey, AccountMap>;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The index is a map of account Pubkeys to a map of Forks and the location of the Account data in an AppendVec. To get the version of an account for a specific Fork:
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
/// Load the account for the pubkey.
|
|
35
|
+
/// This function will load the account from the specified fork, falling back to the fork's parents
|
|
36
|
+
/// * fork - a virtual Accounts instance, keyed by Fork. Accounts keep track of their parents with Forks,
|
|
37
|
+
/// the persistent store
|
|
38
|
+
/// * pubkey - The Account's public key.
|
|
39
|
+
pub fn load_slow(&self, id: Fork, pubkey: &Pubkey) -> Option<&Account>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The read is satisfied by pointing to a memory-mapped location in the `AppendVecId` at the stored offset. A reference can be returned without a copy.
|
|
43
|
+
|
|
44
|
+
### Root Forks
|
|
45
|
+
|
|
46
|
+
[Tower BFT](tower-bft.md) eventually selects a fork as a root fork and the fork is squashed. A squashed/root fork cannot be rolled back.
|
|
47
|
+
|
|
48
|
+
When a fork is squashed, all accounts in its parents not already present in the fork are pulled up into the fork by updating the indexes. Accounts with zero balance in the squashed fork are removed from fork by updating the indexes.
|
|
49
|
+
|
|
50
|
+
An account can be _garbage-collected_ when squashing makes it unreachable.
|
|
51
|
+
|
|
52
|
+
Three possible options exist:
|
|
53
|
+
|
|
54
|
+
- Maintain a HashSet of root forks. One is expected to be created every second. The entire tree can be garbage-collected later. Alternatively, if every fork keeps a reference count of accounts, garbage collection could occur any time an index location is updated.
|
|
55
|
+
- Remove any pruned forks from the index. Any remaining forks lower in number than the root are can be considered root.
|
|
56
|
+
- Scan the index, migrate any old roots into the new one. Any remaining forks lower than the new root can be deleted later.
|
|
57
|
+
|
|
58
|
+
## Garbage collection
|
|
59
|
+
|
|
60
|
+
As accounts get updated, they move to the end of the AppendVec. Once capacity has run out, a new AppendVec can be created and updates can be stored there. Eventually references to an older AppendVec will disappear because all the accounts have been updated, and the old AppendVec can be deleted.
|
|
61
|
+
|
|
62
|
+
To speed up this process, it's possible to move Accounts that have not been recently updated to the front of a new AppendVec. This form of garbage collection can be done without requiring exclusive locks to any of the data structures except for the index update.
|
|
63
|
+
|
|
64
|
+
The initial implementation for garbage collection is that once all the accounts in an AppendVec become stale versions, it gets reused. The accounts are not updated or moved around once appended.
|
|
65
|
+
|
|
66
|
+
## Index Recovery
|
|
67
|
+
|
|
68
|
+
Each bank thread has exclusive access to the accounts during append, since the accounts locks cannot be released until the data is committed. But there is no explicit order of writes between the separate AppendVec files. To create an ordering, the index maintains an atomic write version counter. Each append to the AppendVec records the index write version number for that append in the entry for the Account in the AppendVec.
|
|
69
|
+
|
|
70
|
+
To recover the index, all the AppendVec files can be read in any order, and the latest write version for every fork should be stored in the index.
|
|
71
|
+
|
|
72
|
+
## Snapshots
|
|
73
|
+
|
|
74
|
+
To snapshot, the underlying memory-mapped files in the AppendVec need to be flushed to disk. The index can be written out to disk as well.
|
|
75
|
+
|
|
76
|
+
## Performance
|
|
77
|
+
|
|
78
|
+
- Append-only writes are fast. SSDs and NVMEs, as well as all the OS level kernel data structures, allow for appends to run as fast as PCI or NVMe bandwidth will allow \(2,700 MB/s\).
|
|
79
|
+
- Each replay and banking thread writes concurrently to its own AppendVec.
|
|
80
|
+
- Each AppendVec could potentially be hosted on a separate NVMe.
|
|
81
|
+
- Each replay and banking thread has concurrent read access to all the AppendVecs without blocking writes.
|
|
82
|
+
- Index requires an exclusive write lock for writes. Single-thread performance for HashMap updates is on the order of 10m per second.
|
|
83
|
+
- Banking and Replay stages should use 32 threads per NVMe. NVMes have optimal performance with 32 concurrent readers or writers.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Read-Only Accounts
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
This design covers the handling of readonly and writable accounts in the [runtime](../validator/runtime.md). Multiple transactions that modify the same account must be processed serially so that they are always replayed in the same order. Otherwise, this could introduce non-determinism to the ledger. Some transactions, however, only need to read, and not modify, the data in particular accounts. Multiple transactions that only read the same account can be processed in parallel, since replay order does not matter, providing a performance benefit.
|
|
6
|
+
|
|
7
|
+
In order to identify readonly accounts, the transaction MessageHeader structure contains `num_readonly_signed_accounts` and `num_readonly_unsigned_accounts`. Instruction `program_ids` are included in the account vector as readonly, unsigned accounts, since executable accounts likewise cannot be modified during instruction processing.
|
|
8
|
+
|
|
9
|
+
## Runtime handling
|
|
10
|
+
|
|
11
|
+
Runtime transaction processing rules need to be updated slightly. Programs still can't write or spend accounts that they do not own. But new runtime rules ensure that readonly accounts cannot be modified, even by the programs that own them.
|
|
12
|
+
|
|
13
|
+
Readonly accounts have the following property:
|
|
14
|
+
|
|
15
|
+
- Read-only access to all account fields, including lamports (cannot be credited or debited), and account data
|
|
16
|
+
|
|
17
|
+
Instructions that credit, debit, or modify the readonly account will fail.
|
|
18
|
+
|
|
19
|
+
## Account Lock Optimizations
|
|
20
|
+
|
|
21
|
+
The Accounts module keeps track of current locked accounts in the runtime, which separates readonly accounts from the writable accounts. The default account lock gives an account the "writable" designation, and can only be accessed by one processing thread at one time. Readonly accounts are locked by a separate mechanism, allowing for parallel reads.
|
|
22
|
+
|
|
23
|
+
Although not yet implemented, readonly accounts could be cached in memory and shared between all the threads executing transactions. An ideal design would hold this cache while a readonly account is referenced by any transaction moving through the runtime, and release the cache when the last transaction exits the runtime.
|
|
24
|
+
|
|
25
|
+
Readonly accounts could also be passed into the processor as references, saving an extra copy.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Reliable Vote Transmission
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Validator votes are messages that have a critical function for consensus and continuous operation of the network. Therefore it is critical that they are reliably delivered and encoded into the ledger.
|
|
6
|
+
|
|
7
|
+
## Challenges
|
|
8
|
+
|
|
9
|
+
1. Leader rotation is triggered by PoH, which is clock with high drift. So many nodes are likely to have an incorrect view if the next leader is active in realtime or not.
|
|
10
|
+
2. The next leader may be easily be flooded. Thus a DDOS would not only prevent delivery of regular transactions, but also consensus messages.
|
|
11
|
+
3. UDP is unreliable, and our asynchronous protocol requires any message that is transmitted to be retransmitted until it is observed in the ledger. Retransmittion could potentially cause an unintentional _thundering herd_ against the leader with a large number of validators. Worst case flood would be `(num_nodes * num_retransmits)`.
|
|
12
|
+
4. Tracking if the vote has been transmitted or not via the ledger does not guarantee it will appear in a confirmed block. The current observed block may be unrolled. Validators would need to maintain state for each vote and fork.
|
|
13
|
+
|
|
14
|
+
## Design
|
|
15
|
+
|
|
16
|
+
1. Send votes as a push message through gossip. This ensures delivery of the vote to all the next leaders, not just the next future one.
|
|
17
|
+
2. Leaders will read the Crds table for new votes and encode any new received votes into the blocks they propose. This allows for validator votes to be included in rollback forks by all the future leaders.
|
|
18
|
+
3. Validators that receive votes in the ledger will add them to their local crds table, not as a push request, but simply add them to the table. This shortcuts the push message protocol, so the validation messages do not need to be retransmitted twice around the network.
|
|
19
|
+
4. CrdsValue for vote should look like this `Votes(Vec<Transaction>)`
|
|
20
|
+
|
|
21
|
+
Each vote transaction should maintain a `wallclock` in its data. The merge strategy for Votes will keep the last N set of votes as configured by the local client. For push/pull the vector is traversed recursively and each Transaction is treated as an individual CrdsValue with its own local wallclock and signature.
|
|
22
|
+
|
|
23
|
+
Gossip is designed for efficient propagation of state. Messages that are sent through gossip-push are batched and propagated with a minimum spanning tree to the rest of the network. Any partial failures in the tree are actively repaired with the gossip-pull protocol while minimizing the amount of data transfered between any nodes.
|
|
24
|
+
|
|
25
|
+
## How this design solves the Challenges
|
|
26
|
+
|
|
27
|
+
1. Because there is no easy way for validators to be in sync with leaders on the leader's "active" state, gossip allows for eventual delivery regardless of that state.
|
|
28
|
+
2. Gossip will deliver the messages to all the subsequent leaders, so if the current leader is flooded the next leader would have already received these votes and is able to encode them.
|
|
29
|
+
3. Gossip minimizes the number of requests through the network by maintaining an efficient spanning tree, and using bloom filters to repair state. So retransmit back-off is not necessary and messages are batched.
|
|
30
|
+
4. Leaders that read the crds table for votes will encode all the new valid votes that appear in the table. Even if this leader's block is unrolled, the next leader will try to add the same votes without any additional work done by the validator. Thus ensuring not only eventual delivery, but eventual encoding into the ledger.
|
|
31
|
+
|
|
32
|
+
## Performance
|
|
33
|
+
|
|
34
|
+
1. Worst case propagation time to the next leader is Log\(N\) hops with a base depending on the fanout. With our current default fanout of 6, it is about 6 hops to 20k nodes.
|
|
35
|
+
2. The leader should receive 20k validation votes aggregated by gossip-push into MTU-sized shreds. Which would reduce the number of packets for 20k network to 80 shreds.
|
|
36
|
+
3. Each validators votes is replicated across the entire network. To maintain a queue of 5 previous votes the Crds table would grow by 25 megabytes. `(20,000 nodes * 256 bytes * 5)`.
|
|
37
|
+
|
|
38
|
+
## Two step implementation rollout
|
|
39
|
+
|
|
40
|
+
Initially the network can perform reliably with just 1 vote transmitted and maintained through the network with the current Vote implementation. For small networks a fanout of 6 is sufficient. With small network the memory and push overhead is minor.
|
|
41
|
+
|
|
42
|
+
### Sub 1k validator network
|
|
43
|
+
|
|
44
|
+
1. Crds just maintains the validators latest vote.
|
|
45
|
+
2. Votes are pushed and retransmitted regardless if they are appearing in the ledger.
|
|
46
|
+
3. Fanout of 6.
|
|
47
|
+
4. Worst case 256kb memory overhead per node.
|
|
48
|
+
5. Worst case 4 hops to propagate to every node.
|
|
49
|
+
6. Leader should receive the entire validator vote set in 4 push message shreds.
|
|
50
|
+
|
|
51
|
+
### Sub 20k network
|
|
52
|
+
|
|
53
|
+
Everything above plus the following:
|
|
54
|
+
|
|
55
|
+
1. CRDS table maintains a vector of 5 latest validator votes.
|
|
56
|
+
2. Votes encode a wallclock. CrdsValue::Votes is a type that recurses into the transaction vector for all the gossip protocols.
|
|
57
|
+
3. Increase fanout to 20.
|
|
58
|
+
4. Worst case 25mb memory overhead per node.
|
|
59
|
+
5. Sub 4 hops worst case to deliver to the entire network.
|
|
60
|
+
6. 80 shreds received by the leader for all the validator messages.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Rent
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Accounts on Solana may have owner-controlled state \(`Account::data`\) that's separate from the account's balance \(`Account::lamports`\). Since validators on the network need to maintain a working copy of this state in memory, the network charges a time-and-space based fee for this resource consumption, also known as Rent.
|
|
6
|
+
|
|
7
|
+
## Two-tiered rent regime
|
|
8
|
+
|
|
9
|
+
Accounts which maintain a minimum balance equivalent to 2 years of rent payments are exempt. The _2 years_ is drawn from the fact hardware cost drops by 50% in price every 2 years and the resulting convergence due to being a geometric series. Accounts whose balance falls below this threshold are charged rent at a rate specified in genesis, in lamports per byte-year. The network charges rent on a per-epoch basis, in credit for the next epoch, and `Account::rent_epoch` keeps track of the next time rent should be collected from the account.
|
|
10
|
+
|
|
11
|
+
Currently, the rent cost is fixed at the genesis. However, it's anticipated to be dynamic, reflecting the underlying hardware storage cost at the time. So the price is generally expected to decrease as the hardware cost declines as the technology advances.
|
|
12
|
+
|
|
13
|
+
## Timings of collecting rent
|
|
14
|
+
|
|
15
|
+
There are two timings of collecting rent from accounts: \(1\) when referenced by a transaction, \(2\) periodically once an epoch. \(1\) includes the transaction to create the new account itself, and it happens during the normal transaction processing by the bank as part of the load phase. \(2\) exists to ensure to collect rents from stale accounts, which aren't referenced in recent epochs at all. \(2\) requires the whole scan of accounts and is spread over an epoch based on account address prefix to avoid load spikes due to this rent collection.
|
|
16
|
+
|
|
17
|
+
On the contrary, rent collection isn't applied to accounts that are directly manipulated by any of protocol-level bookkeeping processes including:
|
|
18
|
+
|
|
19
|
+
- The distribution of rent collection itself (Otherwise, it may cause recursive rent collection handling)
|
|
20
|
+
- The distribution of staking rewards at the start of every epoch (To reduce as much as processing spike at the start of new epoch)
|
|
21
|
+
- The distribution of transaction fee at the end of every slot
|
|
22
|
+
|
|
23
|
+
Even if those processes are out of scope of rent collection, all of manipulated accounts will eventually be handled by the \(2\) mechanism.
|
|
24
|
+
|
|
25
|
+
## Actual processing of collecting rent
|
|
26
|
+
|
|
27
|
+
Rent is due for one epoch's worth of time, and accounts have `Account::rent_epoch` of `current_epoch` or `current_epoch + 1` depending on the rent regime.
|
|
28
|
+
|
|
29
|
+
If the account is in the exempt regime, `Account::rent_epoch` is simply updated to `current_epoch`.
|
|
30
|
+
|
|
31
|
+
If the account is non-exempt, the difference between the next epoch and `Account::rent_epoch` is used to calculate the amount of rent owed by this account \(via `Rent::due()`\). Any fractional lamports of the calculation are truncated. Rent due is deducted from `Account::lamports` and `Account::rent_epoch` is updated to `current_epoch + 1` (= next epoch). If the amount of rent due is less than one lamport, no changes are made to the account.
|
|
32
|
+
|
|
33
|
+
Accounts whose balance is insufficient to satisfy the rent that would be due simply fail to load.
|
|
34
|
+
|
|
35
|
+
A percentage of the rent collected is destroyed. The rest is distributed to validator accounts by stake weight, a la transaction fees, at the end of every slot.
|
|
36
|
+
|
|
37
|
+
Finally, rent collection happens according to the protocol-level account updates like the rent distribution to validators, meaning there is no corresponding transaction for rent deductions. So, rent collection is rather invisible, only implicitly observable by a recent transaction or predetermined timing given its account address prefix.
|
|
38
|
+
|
|
39
|
+
## Design considerations
|
|
40
|
+
|
|
41
|
+
### Current design rationale
|
|
42
|
+
|
|
43
|
+
Under the preceding design, it is NOT possible to have accounts that linger, never get touched, and never have to pay rent. Accounts always pay rent exactly once for each epoch, except rent-exempt, sysvar and executable accounts.
|
|
44
|
+
|
|
45
|
+
This is an intended design choice. Otherwise, it would be possible to trigger unauthorized rent collection with `Noop` instruction by anyone who may unfairly profit from the rent (a leader at the moment) or save the rent given anticipated fluctuating rent cost.
|
|
46
|
+
|
|
47
|
+
As another side-effect of this choice, also note that this periodic rent collection effectively forces validators not to store stale accounts into a cold storage optimistically and save the storage cost, which is unfavorable for account owners and may cause transactions on them to stall longer than others. On the flip side, this prevents malicious users from creating significant numbers of garbage accounts, burdening validators.
|
|
48
|
+
|
|
49
|
+
As the overall consequence of this design, all accounts are stored equally as a validator's working set with the same performance characteristics, reflecting the uniform rent pricing structure.
|
|
50
|
+
|
|
51
|
+
### Ad-hoc collection
|
|
52
|
+
|
|
53
|
+
Collecting rent on an as-needed basis \(i.e. whenever accounts were loaded/accessed\) was considered. The issues with such an approach are:
|
|
54
|
+
|
|
55
|
+
- accounts loaded as "credit only" for a transaction could very reasonably be expected to have rent due,
|
|
56
|
+
|
|
57
|
+
but would not be writable during any such transaction
|
|
58
|
+
|
|
59
|
+
- a mechanism to "beat the bushes" \(i.e. go find accounts that need to pay rent\) is desirable,
|
|
60
|
+
|
|
61
|
+
lest accounts that are loaded infrequently get a free ride
|
|
62
|
+
|
|
63
|
+
### System instruction for collecting rent
|
|
64
|
+
|
|
65
|
+
Collecting rent via a system instruction was considered, as it would naturally have distributed rent to active and stake-weighted nodes and could have been done incrementally. However:
|
|
66
|
+
|
|
67
|
+
- it would have adversely affected network throughput
|
|
68
|
+
- it would require special-casing by the runtime, as accounts with non-SystemProgram owners may be debited by this instruction
|
|
69
|
+
- someone would have to issue the transactions
|