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,334 @@
|
|
|
1
|
+
# Transactions v2 - On-chain Address Lookup Tables
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
Messages transmitted to Solana validators must not exceed the IPv6 MTU size to
|
|
6
|
+
ensure fast and reliable network transmission of cluster info over UDP.
|
|
7
|
+
Solana's networking stack uses a conservative MTU size of 1280 bytes which,
|
|
8
|
+
after accounting for headers, leaves 1232 bytes for packet data like serialized
|
|
9
|
+
transactions.
|
|
10
|
+
|
|
11
|
+
Developers building applications on Solana must design their on-chain program
|
|
12
|
+
interfaces within the above transaction size limit constraint. One common
|
|
13
|
+
work-around is to store state temporarily on-chain and consume that state in
|
|
14
|
+
later transactions. This is the approach used by the BPF loader program for
|
|
15
|
+
deploying Solana programs.
|
|
16
|
+
|
|
17
|
+
However, this workaround doesn't work well when developers compose many on-chain
|
|
18
|
+
programs in a single atomic transaction. With more composition comes more
|
|
19
|
+
account inputs, each of which takes up 32 bytes. There is currently no available
|
|
20
|
+
workaround for increasing the number of accounts used in a single transaction
|
|
21
|
+
since each transaction must list all accounts that it needs to properly lock
|
|
22
|
+
accounts for parallel execution. Therefore the current cap is about 35 accounts
|
|
23
|
+
after accounting for signatures and other transaction metadata.
|
|
24
|
+
|
|
25
|
+
## Proposed Solution
|
|
26
|
+
|
|
27
|
+
1) Introduce a new program which manages on-chain address lookup tables
|
|
28
|
+
2) Add a new transaction format which can make use of on-chain
|
|
29
|
+
address lookup tables to efficiently load more accounts in a single transaction.
|
|
30
|
+
|
|
31
|
+
### Address Lookup Table Program
|
|
32
|
+
|
|
33
|
+
Here we describe a program-based solution to the problem, whereby a protocol
|
|
34
|
+
developer or end-user can create collections of related addresses on-chain for
|
|
35
|
+
concise use in a transaction's account inputs.
|
|
36
|
+
|
|
37
|
+
After addresses are stored on-chain in an address lookup table account, they may be
|
|
38
|
+
succinctly referenced in a transaction using a 1-byte u8 index rather than a
|
|
39
|
+
full 32-byte address. This will require a new transaction format to make use of
|
|
40
|
+
these succinct references as well as runtime handling for looking up and loading
|
|
41
|
+
addresses from the on-chain lookup tables.
|
|
42
|
+
|
|
43
|
+
#### State
|
|
44
|
+
|
|
45
|
+
Address lookup tables must be rent-exempt when initialized and after
|
|
46
|
+
each time new addresses are appended. Lookup tables can either be extended
|
|
47
|
+
from an on-chain buffered list of addresses or directly by appending
|
|
48
|
+
addresses through instruction data. Newly appended addresses require
|
|
49
|
+
one slot to warmup before being available to transactions for lookups.
|
|
50
|
+
|
|
51
|
+
Since transactions use a `u8` index to look up addresses, address tables can
|
|
52
|
+
store up to 256 addresses each. In addition to stored addresses, address table
|
|
53
|
+
accounts also tracks various metadata explained below.
|
|
54
|
+
|
|
55
|
+
```rust
|
|
56
|
+
pub struct LookupTableMeta {
|
|
57
|
+
/// The slot used to derive the table's address. The table cannot
|
|
58
|
+
/// be closed until the derivation slot is no longer "recent"
|
|
59
|
+
/// (not accessible in the `SlotHashes` sysvar).
|
|
60
|
+
pub derivation_slot: Slot,
|
|
61
|
+
/// The slot that the table was last extended. Address tables may
|
|
62
|
+
/// only be used to lookup addresses that were extended before
|
|
63
|
+
/// the current bank's slot.
|
|
64
|
+
pub last_extended_slot: Slot,
|
|
65
|
+
/// The start index where the table was last extended from during
|
|
66
|
+
/// the `last_extended_slot`.
|
|
67
|
+
pub last_extended_slot_start_index: u8,
|
|
68
|
+
/// Authority address which must sign for each modification.
|
|
69
|
+
pub authority: Option<Pubkey>,
|
|
70
|
+
// Raw list of addresses follows this serialized structure in
|
|
71
|
+
// the account's data, starting from `LOOKUP_TABLE_META_SIZE`.
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
To make it easier for address lookup tables to be updated by multi-sig or
|
|
76
|
+
governance-controlled authorities, addresses can be buffered on-chain in
|
|
77
|
+
a buffer account. Buffer accounts can be used to extend a lookup table
|
|
78
|
+
with many addresses in a single small transaction.
|
|
79
|
+
|
|
80
|
+
```rust
|
|
81
|
+
pub struct BufferMeta {
|
|
82
|
+
/// Authority address which must sign for each modification.
|
|
83
|
+
pub authority: Pubkey,
|
|
84
|
+
|
|
85
|
+
// Serialized list of stored addresses follows the above metadata.
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
#### Cleanup
|
|
90
|
+
|
|
91
|
+
Once an address lookup table is no longer needed, it can be closed
|
|
92
|
+
and have its rent balance reclaimed. Address lookup tables may not be recreated
|
|
93
|
+
at the same address because each new lookup table must be initialized at an address
|
|
94
|
+
derived from a recent slot.
|
|
95
|
+
|
|
96
|
+
#### Cost
|
|
97
|
+
|
|
98
|
+
Since address lookups require extra overhead during transaction processing,
|
|
99
|
+
they should incur higher costs for a transaction.
|
|
100
|
+
|
|
101
|
+
### Versioned Transactions
|
|
102
|
+
|
|
103
|
+
In order to support address table lookups, the structure of serialized
|
|
104
|
+
transactions must be modified. The new transaction format should not
|
|
105
|
+
affect transaction processing in the Solana program runtime beyond the
|
|
106
|
+
increased capacity for accounts and program invocations. Invoked
|
|
107
|
+
programs will be unaware of which transaction format was used.
|
|
108
|
+
|
|
109
|
+
The new transaction format must be distinguished from the current transaction
|
|
110
|
+
format. Current transactions can fit at most 19 signatures (64-bytes each) but
|
|
111
|
+
the message header encodes `num_required_signatures` as a `u8`. Since the upper
|
|
112
|
+
bit of the `u8` will never be set for a valid transaction, we can enable it to
|
|
113
|
+
denote whether a transaction should be decoded with the versioned format or not.
|
|
114
|
+
|
|
115
|
+
#### New Transaction Format
|
|
116
|
+
|
|
117
|
+
```rust
|
|
118
|
+
#[derive(Serialize, Deserialize)]
|
|
119
|
+
pub struct Transaction {
|
|
120
|
+
#[serde(with = "short_vec")]
|
|
121
|
+
pub signatures: Vec<Signature>,
|
|
122
|
+
/// The message to sign.
|
|
123
|
+
pub message: Message,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Uses custom serialization. If the first bit is set, the remaining bits
|
|
127
|
+
// in the first byte will encode a version number. If the first bit is not
|
|
128
|
+
// set, the first byte will be treated as the first byte of an encoded
|
|
129
|
+
// legacy message.
|
|
130
|
+
pub enum VersionedMessage {
|
|
131
|
+
Legacy(Message),
|
|
132
|
+
V0(v0::Message),
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// The structure of the new v0 Message
|
|
136
|
+
#[derive(Serialize, Deserialize)]
|
|
137
|
+
pub struct Message {
|
|
138
|
+
// unchanged
|
|
139
|
+
pub header: MessageHeader,
|
|
140
|
+
|
|
141
|
+
// unchanged
|
|
142
|
+
#[serde(with = "short_vec")]
|
|
143
|
+
pub account_keys: Vec<Pubkey>,
|
|
144
|
+
|
|
145
|
+
// unchanged
|
|
146
|
+
pub recent_blockhash: Hash,
|
|
147
|
+
|
|
148
|
+
// unchanged
|
|
149
|
+
//
|
|
150
|
+
// # Notes
|
|
151
|
+
//
|
|
152
|
+
// Account and program indexes will index into the list of addresses
|
|
153
|
+
// constructed from the concatenation of three key lists:
|
|
154
|
+
// 1) message `account_keys`
|
|
155
|
+
// 2) ordered list of keys loaded from address table `writable_indexes`
|
|
156
|
+
// 3) ordered list of keys loaded from address table `readable_indexes`
|
|
157
|
+
#[serde(with = "short_vec")]
|
|
158
|
+
pub instructions: Vec<CompiledInstruction>,
|
|
159
|
+
|
|
160
|
+
/// List of address table lookups used to load additional accounts
|
|
161
|
+
/// for this transaction.
|
|
162
|
+
#[serde(with = "short_vec")]
|
|
163
|
+
pub address_table_lookups: Vec<MessageAddressTableLookup>,
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/// Address table lookups describe an on-chain address lookup table to use
|
|
167
|
+
/// for loading more readonly and writable accounts in a single tx.
|
|
168
|
+
#[derive(Serialize, Deserialize)]
|
|
169
|
+
pub struct MessageAddressTableLookup {
|
|
170
|
+
/// Address lookup table account key
|
|
171
|
+
pub account_key: Pubkey,
|
|
172
|
+
/// List of indexes used to load writable account addresses
|
|
173
|
+
#[serde(with = "short_vec")]
|
|
174
|
+
pub writable_indexes: Vec<u8>,
|
|
175
|
+
/// List of indexes used to load readonly account addresses
|
|
176
|
+
#[serde(with = "short_vec")]
|
|
177
|
+
pub readonly_indexes: Vec<u8>,
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
#### Size changes
|
|
182
|
+
|
|
183
|
+
- 1 extra byte for `version` field
|
|
184
|
+
- 1 extra byte for `address_table_lookups` length
|
|
185
|
+
- 34 extra bytes for the address and lengths of the `writable_indexes`
|
|
186
|
+
and `readonly_indexes` indexes in each address table lookup
|
|
187
|
+
- 1 extra byte for each lookup table index
|
|
188
|
+
|
|
189
|
+
#### Metadata changes
|
|
190
|
+
|
|
191
|
+
Each resolved address from an address lookup table should be stored in
|
|
192
|
+
the transaction metadata for quick reference. This will avoid the need for
|
|
193
|
+
clients to make multiple RPC round trips to fetch all accounts loaded by a
|
|
194
|
+
v2 transaction. It will also make it easier to use the ledger tool to
|
|
195
|
+
analyze account access patterns.
|
|
196
|
+
|
|
197
|
+
#### RPC changes
|
|
198
|
+
|
|
199
|
+
Fetched transaction responses will likely require a new version field to
|
|
200
|
+
indicate to clients which transaction structure to use for deserialization.
|
|
201
|
+
Clients using pre-existing RPC methods will receive error responses when
|
|
202
|
+
attempting to fetch a versioned transaction which will indicate that they
|
|
203
|
+
must upgrade.
|
|
204
|
+
|
|
205
|
+
The RPC API should also support an option for returning fully expanded
|
|
206
|
+
transactions to abstract away the address lookup table details from
|
|
207
|
+
downstream clients.
|
|
208
|
+
|
|
209
|
+
### Limitations
|
|
210
|
+
|
|
211
|
+
- Max of 256 unique accounts may be loaded by a transaction because `u8`
|
|
212
|
+
is used by compiled instructions to index into transaction message `account_keys`.
|
|
213
|
+
- Address lookup tables can hold up to 256 entries because lookup table indexes are also `u8`.
|
|
214
|
+
- Transaction signers may not be loaded through an address lookup table, the full
|
|
215
|
+
address of each signer must be serialized in the transaction. This ensures that
|
|
216
|
+
the performance of transaction signature checks is not affected.
|
|
217
|
+
- Hardware wallets will probably not be able to display details about accounts
|
|
218
|
+
referenced through address lookup tables due to inability to verify on-chain data.
|
|
219
|
+
- Only single level address lookup tables can be used. Recursive lookups will not be supported.
|
|
220
|
+
|
|
221
|
+
## Security Concerns
|
|
222
|
+
|
|
223
|
+
### Lookup table re-initialization
|
|
224
|
+
|
|
225
|
+
If an address lookup table can be closed and re-initialized with new addresses,
|
|
226
|
+
any client which is unaware of the change could inadvertently lookup unexpected
|
|
227
|
+
addresses. To avoid this, all address lookup tables must be initialized at an
|
|
228
|
+
address derived from a recent slot and they cannot be closed until the slot
|
|
229
|
+
used for derivation is no longer "recent."
|
|
230
|
+
|
|
231
|
+
### Resource consumption
|
|
232
|
+
|
|
233
|
+
Enabling more account inputs in a transaction allows for more program
|
|
234
|
+
invocations, write-locks, and data reads / writes. Before address tables are
|
|
235
|
+
enabled, transaction-wide compute limits and increased costs for write locks and
|
|
236
|
+
data reads are required.
|
|
237
|
+
|
|
238
|
+
### Front running
|
|
239
|
+
|
|
240
|
+
If the addresses listed within an address lookup table are mutable, front
|
|
241
|
+
running attacks could modify which addresses are resolved for a later
|
|
242
|
+
transaction. For this reason, address lookup tables are append-only and may
|
|
243
|
+
only be closed if it's no longer possible to create a new lookup table at the
|
|
244
|
+
same derived address.
|
|
245
|
+
|
|
246
|
+
Additionally, a malicious actor could try to fork the chain immediately after a
|
|
247
|
+
new address lookup table account is added to a block. If successful, they could
|
|
248
|
+
add a different unexpected table entry in the fork. In order to deter this attack,
|
|
249
|
+
clients should wait for address lookup tables to be finalized before using them in a
|
|
250
|
+
transaction. Clients may also append integrity check instructions to the
|
|
251
|
+
transaction which verify that the correct accounts are looked up.
|
|
252
|
+
|
|
253
|
+
### Denial of service
|
|
254
|
+
|
|
255
|
+
Address lookup table accounts may be read very frequently and will therefore
|
|
256
|
+
be a more high profile target for denial of service attacks through write locks
|
|
257
|
+
similar to sysvar accounts.
|
|
258
|
+
|
|
259
|
+
For this reason, special handling should be given to address lookup tables.
|
|
260
|
+
When an address lookup table is used to lookup addresses for a transaction,
|
|
261
|
+
it can be loaded without waiting for a read lock. To avoid race conditions,
|
|
262
|
+
only the addresses appended in previous blocks can be used for lookups.
|
|
263
|
+
|
|
264
|
+
### Duplicate accounts
|
|
265
|
+
|
|
266
|
+
Transactions may not load an account more than once whether directly through
|
|
267
|
+
`account_keys` or indirectly through `address_table_lookups`.
|
|
268
|
+
|
|
269
|
+
## Other Proposals
|
|
270
|
+
|
|
271
|
+
1) Account prefixes
|
|
272
|
+
|
|
273
|
+
Needing to pre-register accounts in an on-chain address lookup table is cumbersome
|
|
274
|
+
because it adds an extra step for transaction processing. Instead, Solana
|
|
275
|
+
transactions could use variable length address prefixes to specify accounts.
|
|
276
|
+
These prefix shortcuts can save on data usage without needing to setup on-chain
|
|
277
|
+
state.
|
|
278
|
+
|
|
279
|
+
However, this model requires nodes to keep a mapping of prefixes to active account
|
|
280
|
+
addresses. Attackers can create accounts with the same prefix as a popular account
|
|
281
|
+
to disrupt transactions.
|
|
282
|
+
|
|
283
|
+
2) Transaction builder program
|
|
284
|
+
|
|
285
|
+
Solana can provide a new on-chain program which allows "Big" transactions to be
|
|
286
|
+
constructed on-chain by normal transactions. Once the transaction is
|
|
287
|
+
constructed, a final "Execute" transaction can trigger a node to process the big
|
|
288
|
+
transaction as a normal transaction without needing to fit it into an MTU sized
|
|
289
|
+
packet.
|
|
290
|
+
|
|
291
|
+
The UX of this approach is tricky. A user could in theory sign a big transaction
|
|
292
|
+
but it wouldn't be great if they had to use their wallet to sign multiple
|
|
293
|
+
transactions to build that transaction that they already signed and approved. This
|
|
294
|
+
could be a use-case for transaction relay services, though. A user could pay a
|
|
295
|
+
relayer to construct the large pre-signed transaction on-chain for them.
|
|
296
|
+
|
|
297
|
+
In order to prevent the large transaction from being reconstructed and replayed,
|
|
298
|
+
its message hash will need to be added to the status cache when executed.
|
|
299
|
+
|
|
300
|
+
3) Epoch account indexes
|
|
301
|
+
|
|
302
|
+
Similarly to leader schedule calculation, validators could create a global index
|
|
303
|
+
of the most accessed accounts in the previous epoch and make that index
|
|
304
|
+
available to transactions in the following epoch.
|
|
305
|
+
|
|
306
|
+
This approach has a downside of only updating the index at epoch boundaries
|
|
307
|
+
which means there would be a few day delay before popular new accounts could be
|
|
308
|
+
referenced. It also needs to be consistently generated by all validators by
|
|
309
|
+
using some criteria like adding accounts in order by access count.
|
|
310
|
+
|
|
311
|
+
4) Address lists
|
|
312
|
+
|
|
313
|
+
Extend the transaction structure to support addresses that, when loaded, expand
|
|
314
|
+
to a list of addresses. After expansion, all account inputs are concatenated to
|
|
315
|
+
form a single list of account keys which can be indexed into by instructions.
|
|
316
|
+
Address lists would likely need to be immutable to prevent attacks. They would
|
|
317
|
+
also need to be limited in length to limit resource consumption.
|
|
318
|
+
|
|
319
|
+
This proposal can be thought of a special case of the proposed index account
|
|
320
|
+
approach. Since the full account list would be expanded, there's no need to add
|
|
321
|
+
additional offsets that use up the limited space in a serialized transaction.
|
|
322
|
+
However, the expected size of an address list may need to be encoded into the
|
|
323
|
+
transaction to aid the sanitization of account indexes. We would also need to
|
|
324
|
+
encode how many addresses in the list should be loaded as readonly vs
|
|
325
|
+
read-write. Lastly, special attention must be given to watch out for addresses
|
|
326
|
+
that exist in multiple account lists.
|
|
327
|
+
|
|
328
|
+
5) Increase transaction size
|
|
329
|
+
|
|
330
|
+
Significantly larger serialized transactions have an increased likelihood of being
|
|
331
|
+
dropped over the wire but this might not be a big issue since clients can retry
|
|
332
|
+
transactions anyways. The only time validators need to send individual transactions
|
|
333
|
+
over the network is when a leader forwards unprocessed transactions to the next
|
|
334
|
+
leader.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Validator
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## History
|
|
6
|
+
|
|
7
|
+
When we first started Solana, the goal was to de-risk our TPS claims. We knew
|
|
8
|
+
that between optimistic concurrency control and sufficiently long leader slots,
|
|
9
|
+
that PoS consensus was not the biggest risk to TPS. It was GPU-based signature
|
|
10
|
+
verification, software pipelining and concurrent banking. Thus, the TPU was
|
|
11
|
+
born. After topping 100k TPS, we split the team into one group working toward
|
|
12
|
+
710k TPS and another to flesh out the validator pipeline. Hence, the TVU was
|
|
13
|
+
born. The current architecture is a consequence of incremental development with
|
|
14
|
+
that ordering and project priorities. It is not a reflection of what we ever
|
|
15
|
+
believed was the most technically elegant cross-section of those technologies.
|
|
16
|
+
In the context of leader rotation, the strong distinction between leading and
|
|
17
|
+
validating is blurred.
|
|
18
|
+
|
|
19
|
+
## Difference between validating and leading
|
|
20
|
+
|
|
21
|
+
The fundamental difference between the pipelines is when the PoH is present. In
|
|
22
|
+
a leader, we process transactions, removing bad ones, and then tag the result
|
|
23
|
+
with a PoH hash. In the validator, we verify that hash, peel it off, and
|
|
24
|
+
process the transactions in exactly the same way. The only difference is that
|
|
25
|
+
if a validator sees a bad transaction, it can't simply remove it like the
|
|
26
|
+
leader does, because that would cause the PoH hash to change. Instead, it
|
|
27
|
+
rejects the whole block. The other difference between the pipelines is what
|
|
28
|
+
happens _after_ banking. The leader broadcasts entries to downstream validators
|
|
29
|
+
whereas the validator will have already done that in RetransmitStage, which is
|
|
30
|
+
a confirmation time optimization. The validation pipeline, on the other hand,
|
|
31
|
+
has one last step. Any time it finishes processing a block, it needs to weigh
|
|
32
|
+
any forks it's observing, possibly cast a vote, and if so, reset its PoH hash
|
|
33
|
+
to the block hash it just voted on.
|
|
34
|
+
|
|
35
|
+
## Proposed Design
|
|
36
|
+
|
|
37
|
+
We unwrap the many abstraction layers and build a single pipeline that can
|
|
38
|
+
toggle leader mode on whenever the validator's ID shows up in the leader
|
|
39
|
+
schedule.
|
|
40
|
+
|
|
41
|
+

|
|
42
|
+
|
|
43
|
+
## Notable changes
|
|
44
|
+
|
|
45
|
+
- Hoist FetchStage and BroadcastStage out of TPU
|
|
46
|
+
- BankForks renamed to Banktree
|
|
47
|
+
- TPU moves to new socket-free crate called solana-tpu.
|
|
48
|
+
- TPU's BankingStage absorbs ReplayStage
|
|
49
|
+
- TVU goes away
|
|
50
|
+
- New RepairStage absorbs Shred Fetch Stage and repair requests
|
|
51
|
+
- JSON RPC Service is optional - used for debugging. It should instead be part
|
|
52
|
+
of a separate `solana-blockstreamer` executable.
|
|
53
|
+
- New MulticastStage absorbs retransmit part of RetransmitStage
|
|
54
|
+
- MulticastStage downstream of Blockstore
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Secure Vote Signing
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Secure Vote Signing
|
|
6
|
+
|
|
7
|
+
This design describes additional vote signing behavior that will make the process more secure.
|
|
8
|
+
|
|
9
|
+
Currently, Solana implements a vote-signing service that evaluates each vote to ensure it does not violate a slashing condition. The service could potentially have different variations, depending on the hardware platform capabilities. In particular, it could be used in conjunction with a secure enclave \(such as SGX\). The enclave could generate an asymmetric key, exposing an API for user \(untrusted\) code to sign the vote transactions, while keeping the vote-signing private key in its protected memory.
|
|
10
|
+
|
|
11
|
+
The following sections outline how this architecture would work:
|
|
12
|
+
|
|
13
|
+
### Message Flow
|
|
14
|
+
|
|
15
|
+
1. The node initializes the enclave at startup
|
|
16
|
+
|
|
17
|
+
- The enclave generates an asymmetric key and returns the public key to the
|
|
18
|
+
|
|
19
|
+
node
|
|
20
|
+
|
|
21
|
+
- The keypair is ephemeral. A new keypair is generated on node bootup. A
|
|
22
|
+
|
|
23
|
+
new keypair might also be generated at runtime based on some to be determined
|
|
24
|
+
|
|
25
|
+
criteria.
|
|
26
|
+
|
|
27
|
+
- The enclave returns its attestation report to the node
|
|
28
|
+
|
|
29
|
+
2. The node performs attestation of the enclave \(e.g using Intel's IAS APIs\)
|
|
30
|
+
|
|
31
|
+
- The node ensures that the Secure Enclave is running on a TPM and is
|
|
32
|
+
|
|
33
|
+
signed by a trusted party
|
|
34
|
+
|
|
35
|
+
3. The stakeholder of the node grants ephemeral key permission to use its stake.
|
|
36
|
+
|
|
37
|
+
This process is to be determined.
|
|
38
|
+
|
|
39
|
+
4. The node's untrusted, non-enclave software calls trusted enclave software
|
|
40
|
+
|
|
41
|
+
using its interface to sign transactions and other data.
|
|
42
|
+
|
|
43
|
+
- In case of vote signing, the node needs to verify the PoH. The PoH
|
|
44
|
+
|
|
45
|
+
verification is an integral part of signing. The enclave would be
|
|
46
|
+
|
|
47
|
+
presented with some verifiable data to check before signing the vote.
|
|
48
|
+
|
|
49
|
+
- The process of generating the verifiable data in untrusted space is to be determined
|
|
50
|
+
|
|
51
|
+
### PoH Verification
|
|
52
|
+
|
|
53
|
+
1. When the node votes on an en entry `X`, there's a lockout period `N`, for
|
|
54
|
+
|
|
55
|
+
which it cannot vote on a fork that does not contain `X` in its history.
|
|
56
|
+
|
|
57
|
+
2. Every time the node votes on the derivative of `X`, say `X+y`, the lockout
|
|
58
|
+
|
|
59
|
+
period for `X` increases by a factor `F` \(i.e. the duration node cannot vote on
|
|
60
|
+
|
|
61
|
+
a fork that does not contain `X` increases\).
|
|
62
|
+
|
|
63
|
+
- The lockout period for `X+y` is still `N` until the node votes again.
|
|
64
|
+
|
|
65
|
+
3. The lockout period increment is capped \(e.g. factor `F` applies maximum 32
|
|
66
|
+
|
|
67
|
+
times\).
|
|
68
|
+
|
|
69
|
+
4. The signing enclave must not sign a vote that violates this policy. This
|
|
70
|
+
|
|
71
|
+
means
|
|
72
|
+
|
|
73
|
+
- Enclave is initialized with `N`, `F` and `Factor cap`
|
|
74
|
+
- Enclave stores `Factor cap` number of entry IDs on which the node had
|
|
75
|
+
|
|
76
|
+
previously voted
|
|
77
|
+
|
|
78
|
+
- The sign request contains the entry ID for the new vote
|
|
79
|
+
- Enclave verifies that new vote's entry ID is on the correct fork
|
|
80
|
+
|
|
81
|
+
\(following the rules \#1 and \#2 above\)
|
|
82
|
+
|
|
83
|
+
### Ancestor Verification
|
|
84
|
+
|
|
85
|
+
This is alternate, albeit, less certain approach to verifying voting fork. 1. The validator maintains an active set of nodes in the cluster 2. It observes the votes from the active set in the last voting period 3. It stores the ancestor/last_tick at which each node voted 4. It sends new vote request to vote-signing service
|
|
86
|
+
|
|
87
|
+
- It includes previous votes from nodes in the active set, and their
|
|
88
|
+
|
|
89
|
+
corresponding ancestors
|
|
90
|
+
|
|
91
|
+
1. The signer checks if the previous votes contains a vote from the validator,
|
|
92
|
+
|
|
93
|
+
and the vote ancestor matches with majority of the nodes
|
|
94
|
+
|
|
95
|
+
- It signs the new vote if the check is successful
|
|
96
|
+
- It asserts \(raises an alarm of some sort\) if the check is unsuccessful
|
|
97
|
+
|
|
98
|
+
The premise is that the validator can be spoofed at most once to vote on incorrect data. If someone hijacks the validator and submits a vote request for bogus data, that vote will not be included in the PoH \(as it'll be rejected by the cluster\). The next time the validator sends a request to sign the vote, the signing service will detect that validator's last vote is missing \(as part of
|
|
99
|
+
|
|
100
|
+
## 5 above\).
|
|
101
|
+
|
|
102
|
+
### Fork determination
|
|
103
|
+
|
|
104
|
+
Due to the fact that the enclave cannot process PoH, it has no direct knowledge of fork history of a submitted validator vote. Each enclave should be initiated with the current _active set_ of public keys. A validator should submit its current vote along with the votes of the active set \(including itself\) that it observed in the slot of its previous vote. In this way, the enclave can surmise the votes accompanying the validator's previous vote and thus the fork being voted on. This is not possible for the validator's initial submitted vote, as it will not have a 'previous' slot to reference. To account for this, a short voting freeze should apply until the second vote is submitted containing the votes within the active set, along with it's own vote, at the height of the initial vote.
|
|
105
|
+
|
|
106
|
+
### Enclave configuration
|
|
107
|
+
|
|
108
|
+
A staking client should be configurable to prevent voting on inactive forks. This mechanism should use the client's known active set `N_active` along with a threshold vote `N_vote` and a threshold depth `N_depth` to determine whether or not to continue voting on a submitted fork. This configuration should take the form of a rule such that the client will only vote on a fork if it observes more than `N_vote` at `N_depth`. Practically, this represents the client from confirming that it has observed some probability of economic finality of the submitted fork at a depth where an additional vote would create a lockout for an undesirable amount of time if that fork turns out not to be live.
|
|
109
|
+
|
|
110
|
+
### Challenges
|
|
111
|
+
|
|
112
|
+
1. Generation of verifiable data in untrusted space for PoH verification in the
|
|
113
|
+
|
|
114
|
+
enclave.
|
|
115
|
+
|
|
116
|
+
2. Need infrastructure for granting stake to an ephemeral key.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
## Restarting a cluster
|
|
2
|
+
|
|
3
|
+
### Step 1. Identify the slot that the cluster will be restarted at
|
|
4
|
+
|
|
5
|
+
The highest optimistically confirmed slot is the best slot to start from, which
|
|
6
|
+
can be found by looking for
|
|
7
|
+
[this](https://github.com/solana-labs/solana/blob/0264147d42d506fb888f5c4c021a998e231a3e74/core/src/optimistic_confirmation_verifier.rs#L71)
|
|
8
|
+
metrics datapoint. Otherwise use the last root.
|
|
9
|
+
|
|
10
|
+
Call this slot `SLOT_X`
|
|
11
|
+
|
|
12
|
+
### Step 2. Stop the validator(s)
|
|
13
|
+
|
|
14
|
+
### Step 3. Optionally install the new solana version
|
|
15
|
+
|
|
16
|
+
### Step 4. Create a new snapshot for slot `SLOT_X` with a hard fork at slot `SLOT_X`
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
$ solana-ledger-tool -l ledger create-snapshot SLOT_X ledger --hard-fork SLOT_X
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The ledger directory should now contain the new snapshot.
|
|
23
|
+
`solana-ledger-tool create-snapshot` will also output the new shred version, and bank hash value,
|
|
24
|
+
call this NEW_SHRED_VERSION and NEW_BANK_HASH respectively.
|
|
25
|
+
|
|
26
|
+
Adjust your validator's arguments:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
--wait-for-supermajority SLOT_X
|
|
30
|
+
--expected-bank-hash NEW_BANK_HASH
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then restart the validator.
|
|
34
|
+
|
|
35
|
+
Confirm with the log that the validator booted and is now in a holding pattern at `SLOT_X`, waiting for a super majority.
|
|
36
|
+
|
|
37
|
+
Once NEW_SHRED_VERSION is determined, nudge foundation entrypoint operators to update entrypoints.
|
|
38
|
+
|
|
39
|
+
### Step 5. Announce the restart on Discord:
|
|
40
|
+
|
|
41
|
+
Post something like the following to #announcements (adjusting the text as appropriate):
|
|
42
|
+
|
|
43
|
+
> Hi @Validators,
|
|
44
|
+
>
|
|
45
|
+
> We've released v1.1.12 and are ready to get testnet back up again.
|
|
46
|
+
>
|
|
47
|
+
> Steps:
|
|
48
|
+
>
|
|
49
|
+
> 1. Install the v1.1.12 release: https://github.com/solana-labs/solana/releases/tag/v1.1.12
|
|
50
|
+
> 2. a. Preferred method, start from your local ledger with:
|
|
51
|
+
>
|
|
52
|
+
> ```bash
|
|
53
|
+
> solana-validator
|
|
54
|
+
> --wait-for-supermajority SLOT_X # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART
|
|
55
|
+
> --expected-bank-hash NEW_BANK_HASH # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART
|
|
56
|
+
> --hard-fork SLOT_X # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART
|
|
57
|
+
> --no-snapshot-fetch # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART
|
|
58
|
+
> --entrypoint entrypoint.testnet.solana.com:8001
|
|
59
|
+
> --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on
|
|
60
|
+
> --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY
|
|
61
|
+
> --only-known-rpc
|
|
62
|
+
> --limit-ledger-size
|
|
63
|
+
> ... # <-- your other --identity/--vote-account/etc arguments
|
|
64
|
+
> ```
|
|
65
|
+
>
|
|
66
|
+
> b. If your validator doesn't have ledger up to slot SLOT_X or if you have deleted your ledger, have it instead download a snapshot with:
|
|
67
|
+
>
|
|
68
|
+
> ```bash
|
|
69
|
+
> solana-validator
|
|
70
|
+
> --wait-for-supermajority SLOT_X # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART
|
|
71
|
+
> --expected-bank-hash NEW_BANK_HASH # <-- NEW! IMPORTANT! REMOVE AFTER THIS RESTART
|
|
72
|
+
> --entrypoint entrypoint.testnet.solana.com:8001
|
|
73
|
+
> --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on
|
|
74
|
+
> --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY
|
|
75
|
+
> --only-known-rpc
|
|
76
|
+
> --limit-ledger-size
|
|
77
|
+
> ... # <-- your other --identity/--vote-account/etc arguments
|
|
78
|
+
> ```
|
|
79
|
+
>
|
|
80
|
+
> You can check for which slots your ledger has with: `solana-ledger-tool -l path/to/ledger bounds`
|
|
81
|
+
>
|
|
82
|
+
> 3. Wait until 80% of the stake comes online
|
|
83
|
+
>
|
|
84
|
+
> To confirm your restarted validator is correctly waiting for the 80%:
|
|
85
|
+
> a. Look for `N% of active stake visible in gossip` log messages
|
|
86
|
+
> b. Ask it over RPC what slot it's on: `solana --url http://127.0.0.1:8899 slot`. It should return `SLOT_X` until we get to 80% stake
|
|
87
|
+
>
|
|
88
|
+
> Thanks!
|
|
89
|
+
|
|
90
|
+
### Step 7. Wait and listen
|
|
91
|
+
|
|
92
|
+
Monitor the validators as they restart. Answer questions, help folks,
|
|
93
|
+
|
|
94
|
+
## Troubleshooting
|
|
95
|
+
|
|
96
|
+
### 80% of the stake didn't participate in the restart, now what?
|
|
97
|
+
If less than 80% of the stake join the restart after a reasonable amount of
|
|
98
|
+
time, it will be necessary to retry the restart attempt with the stake from the
|
|
99
|
+
non-responsive validators removed.
|
|
100
|
+
|
|
101
|
+
The community should identify and come to social consensus on the set of
|
|
102
|
+
non-responsive validators. Then all participating validators return to Step 4
|
|
103
|
+
and create a new snapshot with additional `--destake-vote-account <PUBKEY>`
|
|
104
|
+
arguments for each of the non-responsive validator's vote account address
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
$ solana-ledger-tool -l ledger create-snapshot SLOT_X ledger --hard-fork SLOT_X \
|
|
108
|
+
--destake-vote-account <VOTE_ACCOUNT_1> \
|
|
109
|
+
--destake-vote-account <VOTE_ACCOUNT_2> \
|
|
110
|
+
.
|
|
111
|
+
.
|
|
112
|
+
--destake-vote-account <VOTE_ACCOUNT_N> \
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
This will cause all stake associated with the non-responsive validators to be
|
|
116
|
+
immediately deactivated. All their stakers will need to re-delegate their stake
|
|
117
|
+
once the cluster restart is successful.
|