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,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AccountsDB Replication for RPC Services
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Problem
|
|
6
|
+
|
|
7
|
+
Validators fall behind the network when bogged down by heavy RPC load. This
|
|
8
|
+
seems to be due to a combination of CPU load and lock contention caused by
|
|
9
|
+
serving RPC requests. The most expensive RPC requests involve account scans.
|
|
10
|
+
|
|
11
|
+
## Solution Overview
|
|
12
|
+
|
|
13
|
+
AccountsDB `replicas` that run separately from the main validator can be used to
|
|
14
|
+
offload account-scan requests. Replicas would only: request and pull account
|
|
15
|
+
updates from the validator, serve client account-state RPC requests, and manage
|
|
16
|
+
AccountsDb and AccountsBackgroundService clean + shrink.
|
|
17
|
+
|
|
18
|
+
The replica communicates to the main validator via a new RPC mechanism to fetch
|
|
19
|
+
metadata information about the replication and the accounts update from the validator.
|
|
20
|
+
The main validator supports only one replica node. A replica node can relay the
|
|
21
|
+
information to 1 or more other replicas forming a replication tree.
|
|
22
|
+
|
|
23
|
+
At the initial start of the replica node, it downloads the latest snapshot
|
|
24
|
+
from a validator and constructs the bank and AccountsDb from it. After that, it queries
|
|
25
|
+
its main validator for new slots and requests the validator to send the updated
|
|
26
|
+
accounts for that slot and update to its own AccountsDb.
|
|
27
|
+
|
|
28
|
+
The same RPC replication mechanism can be used between a replica to another replica.
|
|
29
|
+
This requires the replica to serve both the client and server in the replication model.
|
|
30
|
+
|
|
31
|
+
On the client RPC serving side, `JsonRpcAccountsService` is responsible for serving
|
|
32
|
+
the client RPC calls for accounts related information similar to the existing
|
|
33
|
+
`JsonRpcService`.
|
|
34
|
+
|
|
35
|
+
The replica will also take snapshots periodically so that it can start quickly after
|
|
36
|
+
a restart if the snapshot is not too old.
|
|
37
|
+
|
|
38
|
+
## Detailed Solution
|
|
39
|
+
The following sections provide more details of the design.
|
|
40
|
+
|
|
41
|
+
### Consistency Model
|
|
42
|
+
The AccountsDb information is replicated asynchronously from the main validator to the replica.
|
|
43
|
+
When a query against the replica's AccountsDb is made, the replica may not have the latest
|
|
44
|
+
information of the latest slot. In this regard, it will eventually be consistent. However, for
|
|
45
|
+
a particular slot, the information provided is consistent with that of its peer validator
|
|
46
|
+
for commitment levels confirmed and finalized. For V1, we only support queries at these two
|
|
47
|
+
levels.
|
|
48
|
+
|
|
49
|
+
### Solana Replica Node
|
|
50
|
+
A new node named solana-replica-node will be introduced whose main responsibility is to maintain
|
|
51
|
+
the AccountsDb replica. The RPC node or replica node is used interchangeably in this document.
|
|
52
|
+
It will be a separate executable from the validator.
|
|
53
|
+
|
|
54
|
+
The replica consists of the following major components:
|
|
55
|
+
|
|
56
|
+
The `ReplicaSlotConfirmationRequestor`: this service is responsible for periodically sending the
|
|
57
|
+
request `ReplicaSlotConfirmationRequest` to its peer validator or replica for the latest slots.
|
|
58
|
+
It specifies the latest slot (last_replicated_slot) for which the replica has already
|
|
59
|
+
fetched the accounts information for. This maintains the ReplWorkingSlotSet and manages
|
|
60
|
+
the lifecycle of BankForks, BlockCommitmentCache (for the highest confirmed slot) and
|
|
61
|
+
the optimistically confirmed bank.
|
|
62
|
+
|
|
63
|
+
The `ReplicaSlotConfirmationServer`: this service is responsible for serving the
|
|
64
|
+
`ReplicaSlotConfirmationRequest` and sends the `ReplicaSlotConfirmationResponse` back to the requestor.
|
|
65
|
+
The response consists of a vector of new slots the validator knows of which is later than the
|
|
66
|
+
specified last_replicated_slot. This service also runs in the main validator. This service
|
|
67
|
+
gets the slots for replication from the BankForks, BlockCommitmentCache and OptimiscallyConfirmBank.
|
|
68
|
+
|
|
69
|
+
The `ReplicaAccountsRequestor`: this service is responsible for sending the request
|
|
70
|
+
`ReplicaAccountsRequest` to its peer validator or replica for the `ReplicaAccountInfo` for a
|
|
71
|
+
slot for which it has not completed accounts db replication. The `ReplicaAccountInfo` contains
|
|
72
|
+
the `ReplicaAccountMeta`, Hash and the AccountData. The `ReplicaAccountMeta` contains info about
|
|
73
|
+
the existing `AccountMeta` in addition to the account data length in bytes.
|
|
74
|
+
|
|
75
|
+
The `ReplicaAccountsServer`: this service is reponsible for serving the `ReplicaAccountsRequest`
|
|
76
|
+
and sends `ReplicaAccountsResponse` to the requestor. The response contains the count of the
|
|
77
|
+
ReplAccountInfo and the vector of ReplAccountInfo. This service runs both in the validator
|
|
78
|
+
and the replica relaying replication information. The server can stream the account information
|
|
79
|
+
from its AccountCache or from the storage if already flushed. This is similar to how a snapshot
|
|
80
|
+
package is created from the AccountsDb with the difference that the storage does not need to be
|
|
81
|
+
flushed to the disk before streaming to the client. If the account data is in the cache, it can
|
|
82
|
+
be directly streamed. Care must be taken to avoid account data for a slot being cleaned while
|
|
83
|
+
serving the streaming. When attempting a replication of a slot, if the slot is already cleaned
|
|
84
|
+
up with accounts data cleaned as result of update in later rooted slots, the replica should
|
|
85
|
+
forsake this slot and try the later uncleaned root slot.
|
|
86
|
+
|
|
87
|
+
During replication we also need to replicate the information of accounts that have been cleaned
|
|
88
|
+
up due to zero lamports, i.e. we need to be able to tell the difference between an account in a
|
|
89
|
+
given slot which was not updated and hence has no storage entry in that slot, and one that
|
|
90
|
+
holds 0 lamports and has been cleaned up through the history. We may record this via some
|
|
91
|
+
"Tombstone" mechanism -- recording the dead accounts cleaned up fora slot. The tombstones
|
|
92
|
+
themselves can be removed after exceeding the retention period expressed as epochs. Any
|
|
93
|
+
attempt to replicate slots with tombstones removed will fail and the replica should skip
|
|
94
|
+
this slot and try later ones.
|
|
95
|
+
|
|
96
|
+
The `JsonRpcAccountsService`: this is the RPC service serving client requests for account
|
|
97
|
+
information. The existing JsonRpcService serves other client calls than AccountsDb ones.
|
|
98
|
+
The replica node only serves the AccountsDb calls.
|
|
99
|
+
|
|
100
|
+
The existing JsonRpcService requires `BankForks`, `OptimisticallyConfirmedBank` and
|
|
101
|
+
`BlockCommitmentCache` to load the Bank. The JsonRpcAccountsService will need to use
|
|
102
|
+
information obtained from ReplicaSlotConfirmationResponse to construct the AccountsDb.
|
|
103
|
+
|
|
104
|
+
The `AccountsBackgroundService`: this service also runs in the replica which is responsible
|
|
105
|
+
for taking snapshots periodically and shrinking the AccountsDb and doing accounts cleaning.
|
|
106
|
+
The existing code also uses BankForks which we need to keep in the replica.
|
|
107
|
+
|
|
108
|
+
### Compatibility Consideration
|
|
109
|
+
|
|
110
|
+
For protocol compatibility considerations, all the requests have the replication version which
|
|
111
|
+
is initially set to 1. Alternatively, we can use the validator's version. The RPC server side
|
|
112
|
+
shall check the request version and fail if it is not supported.
|
|
113
|
+
|
|
114
|
+
### Replication Setup
|
|
115
|
+
To limit adverse effects on the validator and the replica due to replication, they can be
|
|
116
|
+
configured with a list of replica nodes which can form a replication pair with it. And the
|
|
117
|
+
replica node is configured with the validator which can serve its requests.
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
### Fault Tolerance
|
|
121
|
+
The main responsibility of making sure the replication is tolerant of faults lies with the
|
|
122
|
+
replica. In case of request failures, the replica shall retry the requests.
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
### Interface
|
|
126
|
+
|
|
127
|
+
Following are the client RPC APIs supported by the replica node in JsonRpcAccountsService.
|
|
128
|
+
|
|
129
|
+
- getAccountInfo
|
|
130
|
+
- getBlockCommitment
|
|
131
|
+
- getMultipleAccounts
|
|
132
|
+
- getProgramAccounts
|
|
133
|
+
- getMinimumBalanceForRentExemption
|
|
134
|
+
- getInflationGovenor
|
|
135
|
+
- getInflationRate
|
|
136
|
+
- getEpochSchedule
|
|
137
|
+
- getRecentBlockhash
|
|
138
|
+
- getFees
|
|
139
|
+
- getFeeCalculatorForBlockhash
|
|
140
|
+
- getFeeRateGovernor
|
|
141
|
+
- getLargestAccounts
|
|
142
|
+
- getSupply
|
|
143
|
+
- getStakeActivation
|
|
144
|
+
- getTokenAccountBalance
|
|
145
|
+
- getTokenSupply
|
|
146
|
+
- getTokenLargestAccounts
|
|
147
|
+
- getTokenAccountsByOwner
|
|
148
|
+
- getTokenAccountsByDelegate
|
|
149
|
+
|
|
150
|
+
Following APIs are not included:
|
|
151
|
+
|
|
152
|
+
- getInflationReward
|
|
153
|
+
- getClusterNodes
|
|
154
|
+
- getRecentPerformanceSamples
|
|
155
|
+
- getGenesisHash
|
|
156
|
+
- getSignatueStatuses
|
|
157
|
+
- getMaxRetransmitSlot
|
|
158
|
+
- getMaxShredInsertSlot
|
|
159
|
+
- sendTransaction
|
|
160
|
+
- simulateTransaction
|
|
161
|
+
- getSlotLeader
|
|
162
|
+
- getSlotLeaders
|
|
163
|
+
- minimumLedgerSlot
|
|
164
|
+
- getBlock
|
|
165
|
+
- getBlockTime
|
|
166
|
+
- getBlocks
|
|
167
|
+
- getBlocksWithLimit
|
|
168
|
+
- getTransaction
|
|
169
|
+
- getSignaturesForAddress
|
|
170
|
+
- getFirstAvailableBlock
|
|
171
|
+
- getBlockProduction
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
Action Items
|
|
175
|
+
|
|
176
|
+
1. Build the replica framework and executable
|
|
177
|
+
2. Integrate snapshot restore code for bootstrap the AccountsDb.
|
|
178
|
+
3. Develop the ReplicaSlotConfirmationRequestor and ReplicaSlotConfirmationServer interface code
|
|
179
|
+
4. Develop the ReplicaSlotConfirmationRequestor and ReplicaSlotConfirmationServer detailed implementations: managing the ReplEligibleSlotSet lifecycle: adding new roots and deleting root to it. And interfaces managing ReplWorkingSlotSet interface: adding and removing. Develop component synthesising information from BankForks, BlockCommitmentCache and OptimistcallyConfirmedBank on the server side and maintaining information on the client side.
|
|
180
|
+
5. Develop the interface code for ReplicaAccountsRequestor and ReplicaAccountsServer
|
|
181
|
+
6. Develop detailed implementation for ReplicaAccountsRequestor and ReplicaAccountsServer and develop the replication account storage serializer and deserializer.
|
|
182
|
+
7. Develop the interface code JsonRpcAccountsService
|
|
183
|
+
8. Detailed Implementation of JsonRpcAccountsService, refactor code to share with part of JsonRpcService.
|
|
184
|
+
9. Integrate with the AccountsBackgroundService in the replica for shrinking, cleaning, snapshotting.
|
|
185
|
+
10. Metrics and performance testing
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Bankless Leader
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
A bankless leader does the minimum amount of work to produce a valid block. The leader is tasked with ingress transactions, sorting and filtering valid transactions, arranging them into entries, shredding the entries and broadcasting the shreds. While a validator only needs to reassemble the block and replay execution of well formed entries. The leader does 3x more memory operations before any bank execution than the validator per processed transaction.
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Normal bank operation for a spend needs to do 2 loads and 2 stores. With this design leader just does 1 load. so 4x less account_db work before generating the block. The store operations are likely to be more expensive than reads.
|
|
10
|
+
|
|
11
|
+
When replay stage starts processing the same transactions, it can assume that PoH is valid, and that all the entries are safe for parallel execution. The fee accounts that have been loaded to produce the block are likely to still be in memory, so the additional load should be warm and the cost is likely to be amortized.
|
|
12
|
+
|
|
13
|
+
## Fee Account
|
|
14
|
+
|
|
15
|
+
The [fee account](../terminology.md#fee_account) pays for the transaction to be included in the block. The leader only needs to validate that the fee account has the balance to pay for the fee.
|
|
16
|
+
|
|
17
|
+
## Balance Cache
|
|
18
|
+
|
|
19
|
+
For the duration of the leaders consecutive blocks, the leader maintains a temporary balance cache for all the processed fee accounts. The cache is a map of pubkeys to lamports.
|
|
20
|
+
|
|
21
|
+
At the start of the first block the balance cache is empty. At the end of the last block the cache is destroyed.
|
|
22
|
+
|
|
23
|
+
The balance cache lookups must reference the same base fork for the entire duration of the cache. At the block boundary, the cache can be reset along with the base fork after replay stage finishes verifying the previous block.
|
|
24
|
+
|
|
25
|
+
## Balance Check
|
|
26
|
+
|
|
27
|
+
Prior to the balance check, the leader validates all the signatures in the transaction.
|
|
28
|
+
|
|
29
|
+
1. Verify the accounts are not in use and BlockHash is valid.
|
|
30
|
+
2. Check if the fee account is present in the cache, or load the account from accounts_db and store the lamport balance in the cache.
|
|
31
|
+
3. If the balance is less than the fee, drop the transaction.
|
|
32
|
+
4. Subtract the fee from the balance.
|
|
33
|
+
5. For all the keys in the transaction that are Credit-Debit and are referenced by an instruction, reduce their balance to 0 in the cache. The account fee is declared as Credit-Debit, but as long as it is not used in any instruction its balance will not be reduced to 0.
|
|
34
|
+
|
|
35
|
+
## Leader Replay
|
|
36
|
+
|
|
37
|
+
Leaders will need to replay their blocks as part of the standard replay stage operation.
|
|
38
|
+
|
|
39
|
+
## Leader Replay With Consecutive Blocks
|
|
40
|
+
|
|
41
|
+
A leader can be scheduled to produce multiple blocks in a row. In that scenario the leader is likely to be producing the next block while the replay stage for the first block is playing.
|
|
42
|
+
|
|
43
|
+
When the leader finishes the replay stage it can reset the balance cache by clearing it, and set a new fork as the base for the cache which can become active on the next block.
|
|
44
|
+
|
|
45
|
+
## Resetting the Balance Cache
|
|
46
|
+
|
|
47
|
+
1. At the start of the block, if the balance cache is uninitialized, set the base fork for the balance cache to be the parent of the block and create an empty cache.
|
|
48
|
+
2. if the cache is initialized, check if block's parents has a new frozen bank that is newer than the current base fork for the balance cache.
|
|
49
|
+
3. if a parent newer than the cache's base fork exist, reset the cache to the parent.
|
|
50
|
+
|
|
51
|
+
## Impact on Clients
|
|
52
|
+
|
|
53
|
+
The same fee account can be reused many times in the same block until it is used once as Credit-Debit by an instruction.
|
|
54
|
+
|
|
55
|
+
Clients that transmit a large number of transactions per second should use a dedicated fee account that is not used as Credit-Debit in any instruction.
|
|
56
|
+
|
|
57
|
+
Once an account fee is used as Credit-Debit, it will fail the balance check until the balance cache is reset.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Block Confirmation
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
A validator votes on a PoH hash for two purposes. First, the vote indicates it
|
|
6
|
+
believes the ledger is valid up until that point in time. Second, since many
|
|
7
|
+
valid forks may exist at a given height, the vote also indicates exclusive
|
|
8
|
+
support for the fork. This document describes only the former. The latter is
|
|
9
|
+
described in [Tower BFT](../implemented-proposals/tower-bft.md).
|
|
10
|
+
|
|
11
|
+
## Current Design
|
|
12
|
+
|
|
13
|
+
To start voting, a validator first registers an account to which it will send
|
|
14
|
+
its votes. It then sends votes to that account. The vote contains the tick
|
|
15
|
+
height of the block it is voting on. The account stores the 32 highest heights.
|
|
16
|
+
|
|
17
|
+
### Problems
|
|
18
|
+
|
|
19
|
+
- Only the validator knows how to find its own votes directly.
|
|
20
|
+
|
|
21
|
+
Other components, such as the one that calculates confirmation time, needs to
|
|
22
|
+
be baked into the validator code. The validator code queries the bank for all
|
|
23
|
+
accounts owned by the vote program.
|
|
24
|
+
|
|
25
|
+
- Voting ballots do not contain a PoH hash. The validator is only voting that
|
|
26
|
+
it has observed an arbitrary block at some height.
|
|
27
|
+
|
|
28
|
+
- Voting ballots do not contain a hash of the bank state. Without that hash,
|
|
29
|
+
there is no evidence that the validator executed the transactions and
|
|
30
|
+
verified there were no double spends.
|
|
31
|
+
|
|
32
|
+
## Proposed Design
|
|
33
|
+
|
|
34
|
+
### No Cross-block State Initially
|
|
35
|
+
|
|
36
|
+
At the moment a block is produced, the leader shall add a NewBlock transaction
|
|
37
|
+
to the ledger with a number of tokens that represents the validation reward.
|
|
38
|
+
It is effectively an incremental multisig transaction that sends tokens from
|
|
39
|
+
the mining pool to the validators. The account should allocate just enough
|
|
40
|
+
space to collect the votes required to achieve a supermajority. When a
|
|
41
|
+
validator observes the NewBlock transaction, it has the option to submit a vote
|
|
42
|
+
that includes a hash of its ledger state (the bank state). Once the account has
|
|
43
|
+
sufficient votes, the vote program should disperse the tokens to the
|
|
44
|
+
validators, which causes the account to be deleted.
|
|
45
|
+
|
|
46
|
+
#### Logging Confirmation Time
|
|
47
|
+
|
|
48
|
+
The bank will need to be aware of the vote program. After each transaction, it
|
|
49
|
+
should check if it is a vote transaction and if so, check the state of that
|
|
50
|
+
account. If the transaction caused the supermajority to be achieved, it should
|
|
51
|
+
log the time since the NewBlock transaction was submitted.
|
|
52
|
+
|
|
53
|
+
### Finality and Payouts
|
|
54
|
+
|
|
55
|
+
[Tower BFT](../implemented-proposals/tower-bft.md) is the proposed fork selection algorithm. It proposes
|
|
56
|
+
that payment to miners be postponed until the _stack_ of validator votes reaches
|
|
57
|
+
a certain depth, at which point rollback is not economically feasible. The vote
|
|
58
|
+
program may therefore implement Tower BFT. Vote instructions would need to
|
|
59
|
+
reference a global Tower account so that it can track cross-block state.
|
|
60
|
+
|
|
61
|
+
## Challenges
|
|
62
|
+
|
|
63
|
+
### On-chain voting
|
|
64
|
+
|
|
65
|
+
Using programs and accounts to implement this is a bit tedious. The hardest
|
|
66
|
+
part is figuring out how much space to allocate in NewBlock. The two variables
|
|
67
|
+
are the _active set_ and the stakes of those validators. If we calculate the
|
|
68
|
+
active set at the time NewBlock is submitted, the number of validators to
|
|
69
|
+
allocate space for is known upfront. If, however, we allow new validators to
|
|
70
|
+
vote on old blocks, then we'd need a way to allocate space dynamically.
|
|
71
|
+
|
|
72
|
+
Similar in spirit, if the leader caches stakes at the time of NewBlock, the
|
|
73
|
+
vote program doesn't need to interact with the bank when it processes votes. If
|
|
74
|
+
we don't, then we have the option to allow stakes to float until a vote is
|
|
75
|
+
submitted. A validator could conceivably reference its own staking account, but
|
|
76
|
+
that'd be the current account value instead of the account value of the most
|
|
77
|
+
recently finalized bank state. The bank currently doesn't offer a means to
|
|
78
|
+
reference accounts from particular points in time.
|
|
79
|
+
|
|
80
|
+
### Voting Implications on Previous Blocks
|
|
81
|
+
|
|
82
|
+
Does a vote on one height imply a vote on all blocks of lower heights of
|
|
83
|
+
that fork? If it does, we'll need a way to lookup the accounts of all
|
|
84
|
+
blocks that haven't yet reached supermajority. If not, the validator could
|
|
85
|
+
send votes to all blocks explicitly to get the block rewards.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Cluster Test Framework
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
This document proposes the Cluster Test Framework \(CTF\). CTF is a test harness that allows tests to execute against a local, in-process cluster or a deployed cluster.
|
|
6
|
+
|
|
7
|
+
## Motivation
|
|
8
|
+
|
|
9
|
+
The goal of CTF is to provide a framework for writing tests independent of where and how the cluster is deployed. Regressions can be captured in these tests and the tests can be run against deployed clusters to verify the deployment. The focus of these tests should be on cluster stability, consensus, fault tolerance, API stability.
|
|
10
|
+
|
|
11
|
+
Tests should verify a single bug or scenario, and should be written with the least amount of internal plumbing exposed to the test.
|
|
12
|
+
|
|
13
|
+
## Design Overview
|
|
14
|
+
|
|
15
|
+
Tests are provided an entry point, which is a `contact_info::ContactInfo` structure, and a keypair that has already been funded.
|
|
16
|
+
|
|
17
|
+
Each node in the cluster is configured with a `validator::ValidatorConfig` at boot time. At boot time this configuration specifies any extra cluster configuration required for the test. The cluster should boot with the configuration when it is run in-process or in a data center.
|
|
18
|
+
|
|
19
|
+
Once booted, the test will discover the cluster through a gossip entry point and configure any runtime behaviors via validator RPC.
|
|
20
|
+
|
|
21
|
+
## Test Interface
|
|
22
|
+
|
|
23
|
+
Each CTF test starts with an opaque entry point and a funded keypair. The test should not depend on how the cluster is deployed, and should be able to exercise all the cluster functionality through the publicly available interfaces.
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
use crate::contact_info::ContactInfo;
|
|
27
|
+
use solana_sdk::signature::{Keypair, Signer};
|
|
28
|
+
pub fn test_this_behavior(
|
|
29
|
+
entry_point_info: &ContactInfo,
|
|
30
|
+
funding_keypair: &Keypair,
|
|
31
|
+
num_nodes: usize,
|
|
32
|
+
)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Cluster Discovery
|
|
36
|
+
|
|
37
|
+
At test start, the cluster has already been established and is fully connected. The test can discover most of the available nodes over a few second.
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
use crate::gossip_service::discover_nodes;
|
|
41
|
+
|
|
42
|
+
// Discover the cluster over a few seconds.
|
|
43
|
+
let cluster_nodes = discover_nodes(&entry_point_info, num_nodes);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Cluster Configuration
|
|
47
|
+
|
|
48
|
+
To enable specific scenarios, the cluster needs to be booted with special configurations. These configurations can be captured in `validator::ValidatorConfig`.
|
|
49
|
+
|
|
50
|
+
For example:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
let mut validator_config = ValidatorConfig::default();
|
|
54
|
+
let local = LocalCluster::new_with_config(
|
|
55
|
+
num_nodes,
|
|
56
|
+
10_000,
|
|
57
|
+
100,
|
|
58
|
+
&validator_config
|
|
59
|
+
);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## How to design a new test
|
|
63
|
+
|
|
64
|
+
For example, there is a bug that shows that the cluster fails when it is flooded with invalid advertised gossip nodes. Our gossip library and protocol may change, but the cluster still needs to stay resilient to floods of invalid advertised gossip nodes.
|
|
65
|
+
|
|
66
|
+
Configure the RPC service:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
let mut validator_config = ValidatorConfig::default();
|
|
70
|
+
validator_config.rpc_config.enable_rpc_gossip_push = true;
|
|
71
|
+
validator_config.rpc_config.enable_rpc_gossip_refresh_active_set = true;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Wire the RPCs and write a new test:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
pub fn test_large_invalid_gossip_nodes(
|
|
78
|
+
entry_point_info: &ContactInfo,
|
|
79
|
+
funding_keypair: &Keypair,
|
|
80
|
+
num_nodes: usize,
|
|
81
|
+
) {
|
|
82
|
+
let cluster = discover_nodes(&entry_point_info, num_nodes);
|
|
83
|
+
|
|
84
|
+
// Poison the cluster.
|
|
85
|
+
let client = create_client(entry_point_info.client_facing_addr(), VALIDATOR_PORT_RANGE);
|
|
86
|
+
for _ in 0..(num_nodes * 100) {
|
|
87
|
+
client.gossip_push(
|
|
88
|
+
cluster_info::invalid_contact_info()
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
sleep(Durration::from_millis(1000));
|
|
92
|
+
|
|
93
|
+
// Force refresh of the active set.
|
|
94
|
+
for node in &cluster {
|
|
95
|
+
let client = create_client(node.client_facing_addr(), VALIDATOR_PORT_RANGE);
|
|
96
|
+
client.gossip_refresh_active_set();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Verify that spends still work.
|
|
100
|
+
verify_spends(&cluster);
|
|
101
|
+
}
|
|
102
|
+
```
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Comprehensive Compute Fees
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Motivation
|
|
6
|
+
|
|
7
|
+
The current fee structure lacks a comprehensive account of the work required by
|
|
8
|
+
a validator to process a transaction. The fee structure is only based on the
|
|
9
|
+
number of signatures in a transaction but is meant to account for the work that
|
|
10
|
+
the validator must perform to validate each transaction. The validator performs
|
|
11
|
+
a lot more user-defined work than just signature verification. Processing a
|
|
12
|
+
transaction typically includes signature verifications, account locking, account
|
|
13
|
+
loading, and instruction processing.
|
|
14
|
+
|
|
15
|
+
## Proposed Solution
|
|
16
|
+
|
|
17
|
+
The following solution does not specify what native token costs are to be
|
|
18
|
+
associated with the new fee structure. Instead, it sets the criteria and
|
|
19
|
+
provides the knobs that a cost model can use to determine those costs.
|
|
20
|
+
|
|
21
|
+
### Fee
|
|
22
|
+
|
|
23
|
+
The goal of the fees is to cover the computation cost of processing a
|
|
24
|
+
transaction. Each of the fee categories below will be represented as a compute
|
|
25
|
+
unit cost that, when added together, encompasses the entire cost of processing
|
|
26
|
+
the transaction. By calculating the total cost of the transaction, the runtime
|
|
27
|
+
can charge a more representative fee and make better transaction scheduling
|
|
28
|
+
decisions.
|
|
29
|
+
|
|
30
|
+
A fee will be calculated based on:
|
|
31
|
+
|
|
32
|
+
1. Number of signatures
|
|
33
|
+
- Fixed rate per signature
|
|
34
|
+
2. Number of write locks
|
|
35
|
+
- Fixed rate per writable account
|
|
36
|
+
3. Data byte cost
|
|
37
|
+
- Fixed rate per byte of the sum of the length all a transactions instruction
|
|
38
|
+
datas
|
|
39
|
+
4. Account sizes
|
|
40
|
+
- Account sizes can't be known up-front but can account for a considerable
|
|
41
|
+
amount of the load the transaction incurs on the network. The payer will
|
|
42
|
+
be charged for a maximum account size (10m) upfront and refunded the
|
|
43
|
+
difference after the actual account sizes are known.
|
|
44
|
+
5. Compute budget
|
|
45
|
+
- Each transaction will be given a default transaction-wide compute budget of
|
|
46
|
+
200k units with the option of requesting a larger budget via a compute
|
|
47
|
+
budget instruction up to a maximum of 1m units. This budget is used to
|
|
48
|
+
limit the time it takes to process a transaction. The compute budget
|
|
49
|
+
portion of the fee will be charged up-front based on the default or
|
|
50
|
+
requested amount. After processing, the actual number of units consumed
|
|
51
|
+
will be known, and the payer will be refunded the difference, so the payer
|
|
52
|
+
only pays for what they used. Builtin programs will have a fixed cost
|
|
53
|
+
while BPF program's cost will be measured at runtime.
|
|
54
|
+
6. Precompiled programs
|
|
55
|
+
- Precompiled programs are performing compute-intensive operations. The work
|
|
56
|
+
incurred by a precompiled program is predictable based on the instruction's
|
|
57
|
+
data array. Therefore a cost will be assigned per precompiled program
|
|
58
|
+
based on the parsing of instruction data. Because precompiled programs are
|
|
59
|
+
processed outside of the bank, their compute cost will not be reflected in
|
|
60
|
+
the compute budget and will not be used in transaction scheduling
|
|
61
|
+
decisions. The methods used to determine the fixed cost of the components
|
|
62
|
+
above are described in
|
|
63
|
+
[#19627](https://github.com/solana-labs/solana/issues/19627)
|
|
64
|
+
|
|
65
|
+
### Cost model
|
|
66
|
+
|
|
67
|
+
The cost model is used to assess what load a transaction will incur during
|
|
68
|
+
in-slot processing and then make decisions on how to best schedule transaction
|
|
69
|
+
into batches.
|
|
70
|
+
|
|
71
|
+
The cost model's criteria are identical to the fee's criteria except for
|
|
72
|
+
signatures and precompiled programs. These two costs are incurred before a
|
|
73
|
+
transaction is scheduled and therefore do not affect how long a transaction
|
|
74
|
+
takes within a slot to process.
|
|
75
|
+
|
|
76
|
+
### Cache account sizes and use them instead of the max
|
|
77
|
+
|
|
78
|
+
https://github.com/solana-labs/solana/issues/20511
|
|
79
|
+
|
|
80
|
+
### Transaction-wide compute caps
|
|
81
|
+
|
|
82
|
+
The current compute budget caps are independently applied to each instruction
|
|
83
|
+
within a transaction. This means the overall transaction cap varies depending on
|
|
84
|
+
how many instructions are in the transaction. To more accurately schedule a
|
|
85
|
+
transaction, the compute budget will be applied transaction-wide. One challenge
|
|
86
|
+
of the transaction-wide cap is that each instruction (program) can no longer
|
|
87
|
+
expect to be given an equal amount of compute units. Each instruction will be
|
|
88
|
+
given the remaining units left over after processing earlier instructions. This
|
|
89
|
+
will provide some additional tuning and composability challenges for developers.
|
|
90
|
+
|
|
91
|
+
### Requestable compute budget caps and heap sizes
|
|
92
|
+
|
|
93
|
+
The precompiled
|
|
94
|
+
[ComputeBudget](https://github.com/solana-labs/solana/blob/00929f836348d76cb3503d0ba5f76f0d275bcc66/sdk/src/compute_budget.rs#L34)
|
|
95
|
+
program can be used to request higher transaction-wide compute budget caps and
|
|
96
|
+
program heap sizes. The requested increases will be reflected in the
|
|
97
|
+
transaction's fee.
|
|
98
|
+
|
|
99
|
+
### Fees for precompiled program failures
|
|
100
|
+
|
|
101
|
+
https://github.com/solana-labs/solana/issues/20481
|
|
102
|
+
|
|
103
|
+
### Rate governing
|
|
104
|
+
|
|
105
|
+
Current rate governing needs to be re-assessed. Fees are being rate
|
|
106
|
+
governed down to their minimums because the number of signatures in each slot is
|
|
107
|
+
far lower than the "target" signatures per slot.
|
|
108
|
+
|
|
109
|
+
Instead of using the number of signatures to rate govern, the cost model will
|
|
110
|
+
feed back information based on the batch/queue load it is seeing. The fees will
|
|
111
|
+
sit at a target rate and only increase if the load goes above a specified but to
|
|
112
|
+
be determined threshold. The governing will be applied across all the fee
|
|
113
|
+
criteria.
|
|
114
|
+
|
|
115
|
+
### Deterministic fees
|
|
116
|
+
|
|
117
|
+
Solana's fees are currently deterministic based on a given blockhash. This
|
|
118
|
+
determinism is a nice feature that simplifies client interactions. An example
|
|
119
|
+
is when draining an account that is also the payer, the transaction issuer can
|
|
120
|
+
pre-compute the fee and then set the entire remaining balance to be transferred
|
|
121
|
+
out without worrying that the fee will change leaving a very small amount
|
|
122
|
+
remaining in the account. Another example is for offline signing, the payer
|
|
123
|
+
signer can guarantee what fee that will be charged for the transaction based on
|
|
124
|
+
the nonce's blockhash.
|
|
125
|
+
|
|
126
|
+
Determinism is achieved in two ways:
|
|
127
|
+
- blockhash queue contains a list of recent (<=~2min) blockhashes and a
|
|
128
|
+
`lamports_per_signature` value. The blockhash queue is one of the snapshot's
|
|
129
|
+
serialized members and thus bank hash depends on it.
|
|
130
|
+
- Nonce accounts used for offline signing contain a `lamports_per_signature`
|
|
131
|
+
value in its account data
|
|
132
|
+
|
|
133
|
+
In both cases, when a transaction is assessed a fee, the
|
|
134
|
+
`lamports_per_signature` to use is looked up (either in the queue or in the
|
|
135
|
+
nonce account's data) using the transaction's blockhash.
|
|
136
|
+
|
|
137
|
+
This currently comes with the following challenges:
|
|
138
|
+
- Exposing the `FeeCalculator` object to the clients (holds the
|
|
139
|
+
`lamports_per_signature`) makes it hard to evolve the fee criteria due to
|
|
140
|
+
backward-compatibility. This issue is being solved by deprecating the
|
|
141
|
+
`FeeCalculator` object and instead the new apis take a message and return a
|
|
142
|
+
fee.
|
|
143
|
+
- Blockhash queue entries contain the fee criteria specifics and are part of the
|
|
144
|
+
bankhash so evolving the fees over time involves more work/risk
|
|
145
|
+
- Nonce accounts store the fee criteria directly in their account data so
|
|
146
|
+
evolving the fees over time requires changes to nonce account data and data
|
|
147
|
+
size.
|
|
148
|
+
|
|
149
|
+
Two solutions to the latter two challenges
|
|
150
|
+
- Get rid of the concept of deterministic fees. Clients ask via RPC to
|
|
151
|
+
calculate the current fee estimate and the actual fee is assessed when the
|
|
152
|
+
transaction is processed. Fee changes will be governed and change slowly
|
|
153
|
+
based on network load so the fee differences will be small within the 2min
|
|
154
|
+
window. Nonce accounts no longer store the fee criteria but instead a fee
|
|
155
|
+
cap. If the assessed fee at the time of processing exceeds the cap then the
|
|
156
|
+
transaction fails. This solution removes fee criteria entirely from the
|
|
157
|
+
blockhash queue and nonce accounts and removes the need for either of those to
|
|
158
|
+
evolve if there is a need for fee criteria to evolve.
|
|
159
|
+
- Retain the concept of deterministic fees. Clients ask via RPC to calculate
|
|
160
|
+
the current fee and pass in a blockhash that fee will be associated with.
|
|
161
|
+
Blockhash queue and nonce accounts switch to a versioned but internal "Fee"
|
|
162
|
+
object (similar to "FeeCalculator"). Each time there is a need for fees to
|
|
163
|
+
evolve the fee object will add a new version and new blockhash queue entries
|
|
164
|
+
and new nonce accounts will use the new version.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Embedding the Move Language
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Problem
|
|
6
|
+
|
|
7
|
+
Solana enables developers to write on-chain programs in general purpose programming languages such as C or Rust, but those programs contain Solana-specific mechanisms. For example, there isn't another chain that asks developers to create a Rust module with a `process_instruction(KeyedAccounts)` function. Whenever practical, Solana should offer application developers more portable options.
|
|
8
|
+
|
|
9
|
+
Until just recently, no popular blockchain offered a language that could expose the value of Solana's massively parallel [runtime](../validator/runtime.md). Solidity contracts, for example, do not separate references to shared data from contract code, and therefore need to be executed serially to ensure deterministic behavior. In practice we see that the most aggressively optimized EVM-based blockchains all seem to peak out around 1,200 TPS - a small fraction of what Solana can do. The Libra project, on the other hand, designed an on-chain programming language called Move that is more suitable for parallel execution. Like Solana's runtime, Move programs depend on accounts for all shared state.
|
|
10
|
+
|
|
11
|
+
The biggest design difference between Solana's runtime and Libra's Move VM is how they manage safe invocations between modules. Solana took an operating systems approach and Libra took the domain-specific language approach. In the runtime, a module must trap back into the runtime to ensure the caller's module did not write to data owned by the callee. Likewise, when the callee completes, it must again trap back to the runtime to ensure the callee did not write to data owned by the caller. Move, on the other hand, includes an advanced type system that allows these checks to be run by its bytecode verifier. Because Move bytecode can be verified, the cost of verification is paid just once, at the time the module is loaded on-chain. In the runtime, the cost is paid each time a transaction crosses between modules. The difference is similar in spirit to the difference between a dynamically-typed language like Python versus a statically-typed language like Java. Solana's runtime allows applications to be written in general purpose programming languages, but that comes with the cost of runtime checks when jumping between programs.
|
|
12
|
+
|
|
13
|
+
This proposal attempts to define a way to embed the Move VM such that:
|
|
14
|
+
|
|
15
|
+
- cross-module invocations within Move do not require the runtime's
|
|
16
|
+
|
|
17
|
+
cross-program runtime checks
|
|
18
|
+
|
|
19
|
+
- Move programs can leverage functionality in other Solana programs and vice
|
|
20
|
+
|
|
21
|
+
versa
|
|
22
|
+
|
|
23
|
+
- Solana's runtime parallelism is exposed to batches of Move and non-Move
|
|
24
|
+
|
|
25
|
+
transactions
|
|
26
|
+
|
|
27
|
+
## Proposed Solution
|
|
28
|
+
|
|
29
|
+
### Move VM as a Solana loader
|
|
30
|
+
|
|
31
|
+
The Move VM shall be embedded as a Solana loader under the identifier `MOVE_PROGRAM_ID`, so that Move modules can be marked as `executable` with the VM as its `owner`. This will allow modules to load module dependencies, as well as allow for parallel execution of Move scripts.
|
|
32
|
+
|
|
33
|
+
All data accounts owned by Move modules must set their owners to the loader, `MOVE_PROGRAM_ID`. Since Move modules encapsulate their account data in the same way Solana programs encapsulate theirs, the Move module owner should be embedded in the account data. The runtime will grant write access to the Move VM, and Move grants access to the module accounts.
|
|
34
|
+
|
|
35
|
+
### Interacting with Solana programs
|
|
36
|
+
|
|
37
|
+
To invoke instructions in non-Move programs, Solana would need to extend the Move VM with a `process_instruction()` system call. It would work the same as `process_instruction()` Rust BPF programs.
|