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,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Runtime"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Capability of Programs
|
|
6
|
+
|
|
7
|
+
The runtime only permits the owner program to debit the account or modify its
|
|
8
|
+
data. The program then defines additional rules for whether the client can
|
|
9
|
+
modify accounts it owns. In the case of the System program, it allows users to
|
|
10
|
+
transfer lamports by recognizing transaction signatures. If it sees the client
|
|
11
|
+
signed the transaction using the keypair's _private key_, it knows the client
|
|
12
|
+
authorized the token transfer.
|
|
13
|
+
|
|
14
|
+
In other words, the entire set of accounts owned by a given program can be
|
|
15
|
+
regarded as a key-value store where a key is the account address and value is
|
|
16
|
+
program-specific arbitrary binary data. A program author can decide how to
|
|
17
|
+
manage the program's whole state as possibly many accounts.
|
|
18
|
+
|
|
19
|
+
After the runtime executes each of the transaction's instructions, it uses the
|
|
20
|
+
account metadata to verify that the access policy was not violated. If a program
|
|
21
|
+
violates the policy, the runtime discards all account changes made by all
|
|
22
|
+
instructions in the transaction and marks the transaction as failed.
|
|
23
|
+
|
|
24
|
+
### Policy
|
|
25
|
+
|
|
26
|
+
After a program has processed an instruction the runtime verifies that the
|
|
27
|
+
program only performed operations it was permitted to, and that the results
|
|
28
|
+
adhere to the runtime policy.
|
|
29
|
+
|
|
30
|
+
The policy is as follows:
|
|
31
|
+
|
|
32
|
+
- Only the owner of the account may change owner.
|
|
33
|
+
- And only if the account is writable.
|
|
34
|
+
- And only if the account is not executable
|
|
35
|
+
- And only if the data is zero-initialized or empty.
|
|
36
|
+
- An account not assigned to the program cannot have its balance decrease.
|
|
37
|
+
- The balance of read-only and executable accounts may not change.
|
|
38
|
+
- Only the system program can change the size of the data and only if the system
|
|
39
|
+
program owns the account.
|
|
40
|
+
- Only the owner may change account data.
|
|
41
|
+
- And if the account is writable.
|
|
42
|
+
- And if the account is not executable.
|
|
43
|
+
- Executable is one-way (false->true) and only the account owner may set it.
|
|
44
|
+
- No one can make modifications to the rent_epoch associated with this account.
|
|
45
|
+
|
|
46
|
+
## Compute Budget
|
|
47
|
+
|
|
48
|
+
To prevent a program from abusing computation resources each instruction in a
|
|
49
|
+
transaction is given a compute budget. The budget consists of computation units
|
|
50
|
+
that are consumed as the program performs various operations and bounds that the
|
|
51
|
+
program may not exceed. When the program consumes its entire budget or exceeds
|
|
52
|
+
a bound then the runtime halts the program and returns an error.
|
|
53
|
+
|
|
54
|
+
The following operations incur a compute cost:
|
|
55
|
+
|
|
56
|
+
- Executing BPF instructions
|
|
57
|
+
- Calling system calls
|
|
58
|
+
- logging
|
|
59
|
+
- creating program addresses
|
|
60
|
+
- cross-program invocations
|
|
61
|
+
- ...
|
|
62
|
+
|
|
63
|
+
For cross-program invocations the programs invoked inherit the budget of their
|
|
64
|
+
parent. If an invoked program consume the budget or exceeds a bound the entire
|
|
65
|
+
invocation chain and the parent are halted.
|
|
66
|
+
|
|
67
|
+
The current [compute
|
|
68
|
+
budget](https://github.com/solana-labs/solana/blob/d3a3a7548c857f26ec2cb10e270da72d373020ec/sdk/src/process_instruction.rs#L65)
|
|
69
|
+
can be found in the Solana SDK.
|
|
70
|
+
|
|
71
|
+
For example, if the current budget is:
|
|
72
|
+
|
|
73
|
+
```rust
|
|
74
|
+
max_units: 200,000,
|
|
75
|
+
log_units: 100,
|
|
76
|
+
log_u64_units: 100,
|
|
77
|
+
create_program address units: 1500,
|
|
78
|
+
invoke_units: 1000,
|
|
79
|
+
max_invoke_depth: 4,
|
|
80
|
+
max_call_depth: 64,
|
|
81
|
+
stack_frame_size: 4096,
|
|
82
|
+
log_pubkey_units: 100,
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Then the program
|
|
86
|
+
|
|
87
|
+
- Could execute 200,000 BPF instructions if it does nothing else
|
|
88
|
+
- Could log 2,000 log messages
|
|
89
|
+
- Can not exceed 4k of stack usage
|
|
90
|
+
- Can not exceed a BPF call depth of 64
|
|
91
|
+
- Cannot exceed 4 levels of cross-program invocations.
|
|
92
|
+
|
|
93
|
+
Since the compute budget is consumed incrementally as the program executes the
|
|
94
|
+
total budget consumption will be a combination of the various costs of the
|
|
95
|
+
operations it performs.
|
|
96
|
+
|
|
97
|
+
At runtime a program may log how much of the compute budget remains. See
|
|
98
|
+
[debugging](developing/on-chain-programs/debugging.md#monitoring-compute-budget-consumption)
|
|
99
|
+
for more information.
|
|
100
|
+
|
|
101
|
+
The budget values are conditional on feature enablement, take a look at the
|
|
102
|
+
compute budget's
|
|
103
|
+
[new](https://github.com/solana-labs/solana/blob/d3a3a7548c857f26ec2cb10e270da72d373020ec/sdk/src/process_instruction.rs#L97)
|
|
104
|
+
function to find out how the budget is constructed. An understanding of how
|
|
105
|
+
[features](runtime.md#features) work and what features are enabled on the
|
|
106
|
+
cluster being used are required to determine the current budget's values.
|
|
107
|
+
|
|
108
|
+
## New Features
|
|
109
|
+
|
|
110
|
+
As Solana evolves, new features or patches may be introduced that changes the
|
|
111
|
+
behavior of the cluster and how programs run. Changes in behavior must be
|
|
112
|
+
coordinated between the various nodes of the cluster, if nodes do not coordinate
|
|
113
|
+
then these changes can result in a break-down of consensus. Solana supports a
|
|
114
|
+
mechanism called runtime features to facilitate the smooth adoption of changes.
|
|
115
|
+
|
|
116
|
+
Runtime features are epoch coordinated events where one or more behavior changes
|
|
117
|
+
to the cluster will occur. New changes to Solana that will change behavior are
|
|
118
|
+
wrapped with feature gates and disabled by default. The Solana tools are then
|
|
119
|
+
used to activate a feature, which marks it pending, once marked pending the
|
|
120
|
+
feature will be activated at the next epoch.
|
|
121
|
+
|
|
122
|
+
To determine which features are activated use the [Solana command-line
|
|
123
|
+
tools](cli/install-solana-cli-tools.md):
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
solana feature status
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
If you encounter problems first ensure that the Solana tools version you are
|
|
130
|
+
using match the version returned by `solana cluster-version`. If they do not
|
|
131
|
+
match [install the correct tool suite](cli/install-solana-cli-tools.md).
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Transactions"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Program execution begins with a [transaction](terminology.md#transaction) being
|
|
6
|
+
submitted to the cluster. The Solana runtime will execute a program to process
|
|
7
|
+
each of the [instructions](terminology.md#instruction) contained in the
|
|
8
|
+
transaction, in order, and atomically.
|
|
9
|
+
|
|
10
|
+
## Anatomy of a Transaction
|
|
11
|
+
|
|
12
|
+
This section covers the binary format of a transaction.
|
|
13
|
+
|
|
14
|
+
### Transaction Format
|
|
15
|
+
|
|
16
|
+
A transaction contains a [compact-array](#compact-array-format) of signatures,
|
|
17
|
+
followed by a [message](#message-format). Each item in the signatures array is
|
|
18
|
+
a [digital signature](#signature-format) of the given message. The Solana
|
|
19
|
+
runtime verifies that the number of signatures matches the number in the first
|
|
20
|
+
8 bits of the [message header](#message-header-format). It also verifies that
|
|
21
|
+
each signature was signed by the private key corresponding to the public key at
|
|
22
|
+
the same index in the message's account addresses array.
|
|
23
|
+
|
|
24
|
+
#### Signature Format
|
|
25
|
+
|
|
26
|
+
Each digital signature is in the ed25519 binary format and consumes 64 bytes.
|
|
27
|
+
|
|
28
|
+
### Message Format
|
|
29
|
+
|
|
30
|
+
A message contains a [header](#message-header-format), followed by a
|
|
31
|
+
compact-array of [account addresses](#account-addresses-format), followed by a
|
|
32
|
+
recent [blockhash](#blockhash-format), followed by a compact-array of
|
|
33
|
+
[instructions](#instruction-format).
|
|
34
|
+
|
|
35
|
+
#### Message Header Format
|
|
36
|
+
|
|
37
|
+
The message header contains three unsigned 8-bit values. The first value is the
|
|
38
|
+
number of required signatures in the containing transaction. The second value
|
|
39
|
+
is the number of those corresponding account addresses that are read-only. The
|
|
40
|
+
third value in the message header is the number of read-only account addresses
|
|
41
|
+
not requiring signatures.
|
|
42
|
+
|
|
43
|
+
#### Account Addresses Format
|
|
44
|
+
|
|
45
|
+
The addresses that require signatures appear at the beginning of the account
|
|
46
|
+
address array, with addresses requesting write access first and read-only
|
|
47
|
+
accounts following. The addresses that do not require signatures follow the
|
|
48
|
+
addresses that do, again with read-write accounts first and read-only accounts
|
|
49
|
+
following.
|
|
50
|
+
|
|
51
|
+
#### Blockhash Format
|
|
52
|
+
|
|
53
|
+
A blockhash contains a 32-byte SHA-256 hash. It is used to indicate when a
|
|
54
|
+
client last observed the ledger. Validators will reject transactions when the
|
|
55
|
+
blockhash is too old.
|
|
56
|
+
|
|
57
|
+
### Instruction Format
|
|
58
|
+
|
|
59
|
+
An instruction contains a program id index, followed by a compact-array of
|
|
60
|
+
account address indexes, followed by a compact-array of opaque 8-bit data. The
|
|
61
|
+
program id index is used to identify an on-chain program that can interpret the
|
|
62
|
+
opaque data. The program id index is an unsigned 8-bit index to an account
|
|
63
|
+
address in the message's array of account addresses. The account address
|
|
64
|
+
indexes are each an unsigned 8-bit index into that same array.
|
|
65
|
+
|
|
66
|
+
### Compact-Array Format
|
|
67
|
+
|
|
68
|
+
A compact-array is serialized as the array length, followed by each array item.
|
|
69
|
+
The array length is a special multi-byte encoding called compact-u16.
|
|
70
|
+
|
|
71
|
+
#### Compact-u16 Format
|
|
72
|
+
|
|
73
|
+
A compact-u16 is a multi-byte encoding of 16 bits. The first byte contains the
|
|
74
|
+
lower 7 bits of the value in its lower 7 bits. If the value is above 0x7f, the
|
|
75
|
+
high bit is set and the next 7 bits of the value are placed into the lower 7
|
|
76
|
+
bits of a second byte. If the value is above 0x3fff, the high bit is set and
|
|
77
|
+
the remaining 2 bits of the value are placed into the lower 2 bits of a third
|
|
78
|
+
byte.
|
|
79
|
+
|
|
80
|
+
### Account Address Format
|
|
81
|
+
|
|
82
|
+
An account address is 32-bytes of arbitrary data. When the address requires a
|
|
83
|
+
digital signature, the runtime interprets it as the public key of an ed25519
|
|
84
|
+
keypair.
|
|
85
|
+
|
|
86
|
+
## Instructions
|
|
87
|
+
|
|
88
|
+
Each [instruction](terminology.md#instruction) specifies a single program, a
|
|
89
|
+
subset of the transaction's accounts that should be passed to the program, and a
|
|
90
|
+
data byte array that is passed to the program. The program interprets the data
|
|
91
|
+
array and operates on the accounts specified by the instructions. The program
|
|
92
|
+
can return successfully, or with an error code. An error return causes the
|
|
93
|
+
entire transaction to fail immediately.
|
|
94
|
+
|
|
95
|
+
Programs typically provide helper functions to construct instructions they
|
|
96
|
+
support. For example, the system program provides the following Rust helper to
|
|
97
|
+
construct a
|
|
98
|
+
[`SystemInstruction::CreateAccount`](https://github.com/solana-labs/solana/blob/6606590b8132e56dab9e60b3f7d20ba7412a736c/sdk/program/src/system_instruction.rs#L63)
|
|
99
|
+
instruction:
|
|
100
|
+
|
|
101
|
+
```rust
|
|
102
|
+
pub fn create_account(
|
|
103
|
+
from_pubkey: &Pubkey,
|
|
104
|
+
to_pubkey: &Pubkey,
|
|
105
|
+
lamports: u64,
|
|
106
|
+
space: u64,
|
|
107
|
+
owner: &Pubkey,
|
|
108
|
+
) -> Instruction {
|
|
109
|
+
let account_metas = vec![
|
|
110
|
+
AccountMeta::new(*from_pubkey, true),
|
|
111
|
+
AccountMeta::new(*to_pubkey, true),
|
|
112
|
+
];
|
|
113
|
+
Instruction::new_with_bincode(
|
|
114
|
+
system_program::id(),
|
|
115
|
+
&SystemInstruction::CreateAccount {
|
|
116
|
+
lamports,
|
|
117
|
+
space,
|
|
118
|
+
owner: *owner,
|
|
119
|
+
},
|
|
120
|
+
account_metas,
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Which can be found here:
|
|
126
|
+
|
|
127
|
+
https://github.com/solana-labs/solana/blob/6606590b8132e56dab9e60b3f7d20ba7412a736c/sdk/program/src/system_instruction.rs#L220
|
|
128
|
+
|
|
129
|
+
### Program Id
|
|
130
|
+
|
|
131
|
+
The instruction's [program id](terminology.md#program-id) specifies which
|
|
132
|
+
program will process this instruction. The program's account's owner specifies
|
|
133
|
+
which loader should be used to load and execute the program and the data
|
|
134
|
+
contains information about how the runtime should execute the program.
|
|
135
|
+
|
|
136
|
+
In the case of [on-chain BPF programs](developing/on-chain-programs/overview.md),
|
|
137
|
+
the owner is the BPF Loader and the account data holds the BPF bytecode. Program
|
|
138
|
+
accounts are permanently marked as executable by the loader once they are
|
|
139
|
+
successfully deployed. The runtime will reject transactions that specify programs
|
|
140
|
+
that are not executable.
|
|
141
|
+
|
|
142
|
+
Unlike on-chain programs, [Native Programs](developing/runtime-facilities/programs.md)
|
|
143
|
+
are handled differently in that they are built directly into the Solana runtime.
|
|
144
|
+
|
|
145
|
+
### Accounts
|
|
146
|
+
|
|
147
|
+
The accounts referenced by an instruction represent on-chain state and serve as
|
|
148
|
+
both the inputs and outputs of a program. More information about Accounts can be
|
|
149
|
+
found in the [Accounts](accounts.md) section.
|
|
150
|
+
|
|
151
|
+
### Instruction data
|
|
152
|
+
|
|
153
|
+
Each instruction caries a general purpose byte array that is passed to the
|
|
154
|
+
program along with the accounts. The contents of the instruction data is program
|
|
155
|
+
specific and typically used to convey what operations the program should
|
|
156
|
+
perform, and any additional information those operations may need above and
|
|
157
|
+
beyond what the accounts contain.
|
|
158
|
+
|
|
159
|
+
Programs are free to specify how information is encoded into the instruction
|
|
160
|
+
data byte array. The choice of how data is encoded should take into account the
|
|
161
|
+
overhead of decoding since that step is performed by the program on-chain. It's
|
|
162
|
+
been observed that some common encodings (Rust's bincode for example) are very
|
|
163
|
+
inefficient.
|
|
164
|
+
|
|
165
|
+
The [Solana Program Library's Token
|
|
166
|
+
program](https://github.com/solana-labs/solana-program-library/tree/master/token)
|
|
167
|
+
gives one example of how instruction data can be encoded efficiently, but note
|
|
168
|
+
that this method only supports fixed sized types. Token utilizes the
|
|
169
|
+
[Pack](https://github.com/solana-labs/solana/blob/master/sdk/program/src/program_pack.rs)
|
|
170
|
+
trait to encode/decode instruction data for both token instructions as well as
|
|
171
|
+
token account states.
|
|
172
|
+
|
|
173
|
+
### Multiple instructions in a single transaction
|
|
174
|
+
|
|
175
|
+
A transaction can contain instructions in any order. This means a malicious
|
|
176
|
+
user could craft transactions that may pose instructions in an order that the
|
|
177
|
+
program has not been protected against. Programs should be hardened to properly
|
|
178
|
+
and safely handle any possible instruction sequence.
|
|
179
|
+
|
|
180
|
+
One not so obvious example is account deinitialization. Some programs may
|
|
181
|
+
attempt to deinitialize an account by setting its lamports to zero, with the
|
|
182
|
+
assumption that the runtime will delete the account. This assumption may be
|
|
183
|
+
valid between transactions, but it is not between instructions or cross-program
|
|
184
|
+
invocations. To harden against this, the program should also explicitly zero out the
|
|
185
|
+
account's data.
|
|
186
|
+
|
|
187
|
+
An example of where this could be a problem is if a token program, upon
|
|
188
|
+
transferring the token out of an account, sets the account's lamports to zero,
|
|
189
|
+
assuming it will be deleted by the runtime. If the program does not zero out the
|
|
190
|
+
account's data, a malicious user could trail this instruction with another that
|
|
191
|
+
transfers the tokens a second time.
|
|
192
|
+
|
|
193
|
+
## Signatures
|
|
194
|
+
|
|
195
|
+
Each transaction explicitly lists all account public keys referenced by the
|
|
196
|
+
transaction's instructions. A subset of those public keys are each accompanied
|
|
197
|
+
by a transaction signature. Those signatures signal on-chain programs that the
|
|
198
|
+
account holder has authorized the transaction. Typically, the program uses the
|
|
199
|
+
authorization to permit debiting the account or modifying its data. More
|
|
200
|
+
information about how the authorization is communicated to a program can be
|
|
201
|
+
found in [Accounts](accounts.md#signers)
|
|
202
|
+
|
|
203
|
+
## Recent Blockhash
|
|
204
|
+
|
|
205
|
+
A transaction includes a recent [blockhash](terminology.md#blockhash) to prevent
|
|
206
|
+
duplication and to give transactions lifetimes. Any transaction that is
|
|
207
|
+
completely identical to a previous one is rejected, so adding a newer blockhash
|
|
208
|
+
allows multiple transactions to repeat the exact same action. Transactions also
|
|
209
|
+
have lifetimes that are defined by the blockhash, as any transaction whose
|
|
210
|
+
blockhash is too old will be rejected.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Native Programs"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Solana contains a small handful of native programs, which are required to run
|
|
6
|
+
validator nodes. Unlike third-party programs, the native programs are part of
|
|
7
|
+
the validator implementation and can be upgraded as part of cluster upgrades.
|
|
8
|
+
Upgrades may occur to add features, fix bugs, or improve performance. Interface
|
|
9
|
+
changes to individual instructions should rarely, if ever, occur. Instead, when
|
|
10
|
+
change is needed, new instructions are added and previous ones are marked
|
|
11
|
+
deprecated. Apps can upgrade on their own timeline without concern of breakages
|
|
12
|
+
across upgrades.
|
|
13
|
+
|
|
14
|
+
For each native program the program id and description each supported
|
|
15
|
+
instruction is provided. A transaction can mix and match instructions from different
|
|
16
|
+
programs, as well include instructions from on-chain programs.
|
|
17
|
+
|
|
18
|
+
## System Program
|
|
19
|
+
|
|
20
|
+
Create new accounts, allocate account data, assign accounts to owning programs,
|
|
21
|
+
transfer lamports from System Program owned accounts and pay transacation fees.
|
|
22
|
+
|
|
23
|
+
- Program id: `11111111111111111111111111111111`
|
|
24
|
+
- Instructions: [SystemInstruction](https://docs.rs/solana-sdk/VERSION_FOR_DOCS_RS/solana_sdk/system_instruction/enum.SystemInstruction.html)
|
|
25
|
+
|
|
26
|
+
## Config Program
|
|
27
|
+
|
|
28
|
+
Add configuration data to the chain and the list of public keys that are permitted to modify it
|
|
29
|
+
|
|
30
|
+
- Program id: `Config1111111111111111111111111111111111111`
|
|
31
|
+
- Instructions: [config_instruction](https://docs.rs/solana-config-program/VERSION_FOR_DOCS_RS/solana_config_program/config_instruction/index.html)
|
|
32
|
+
|
|
33
|
+
Unlike the other programs, the Config program does not define any individual
|
|
34
|
+
instructions. It has just one implicit instruction, a "store" instruction. Its
|
|
35
|
+
instruction data is a set of keys that gate access to the account, and the
|
|
36
|
+
data to store in it.
|
|
37
|
+
|
|
38
|
+
## Stake Program
|
|
39
|
+
|
|
40
|
+
Create and manage accounts representing stake and rewards for delegations to
|
|
41
|
+
validators.
|
|
42
|
+
|
|
43
|
+
- Program id: `Stake11111111111111111111111111111111111111`
|
|
44
|
+
- Instructions: [StakeInstruction](https://docs.rs/solana-sdk/VERSION_FOR_DOCS_RS/solana_sdk/stake/instruction/enum.StakeInstruction.html)
|
|
45
|
+
|
|
46
|
+
## Vote Program
|
|
47
|
+
|
|
48
|
+
Create and manage accounts that track validator voting state and rewards.
|
|
49
|
+
|
|
50
|
+
- Program id: `Vote111111111111111111111111111111111111111`
|
|
51
|
+
- Instructions: [VoteInstruction](https://docs.rs/solana-vote-program/VERSION_FOR_DOCS_RS/solana_vote_program/vote_instruction/enum.VoteInstruction.html)
|
|
52
|
+
|
|
53
|
+
## BPF Loader
|
|
54
|
+
|
|
55
|
+
Deploys, upgrades, and executes programs on the chain.
|
|
56
|
+
|
|
57
|
+
- Program id: `BPFLoaderUpgradeab1e11111111111111111111111`
|
|
58
|
+
- Instructions: [LoaderInstruction](https://docs.rs/solana-sdk/VERSION_FOR_DOCS_RS/solana_sdk/loader_upgradeable_instruction/enum.UpgradeableLoaderInstruction.html)
|
|
59
|
+
|
|
60
|
+
The BPF Upgradeable Loader marks itself as "owner" of the executable and
|
|
61
|
+
program-data accounts it creates to store your program. When a user invokes an
|
|
62
|
+
instruction via a program id, the Solana runtime will load both your the program
|
|
63
|
+
and its owner, the BPF Upgradeable Loader. The runtime then passes your program
|
|
64
|
+
to the BPF Upgradeable Loader to process the instruction.
|
|
65
|
+
|
|
66
|
+
[More information about deployment](cli/deploy-a-program.md)
|
|
67
|
+
|
|
68
|
+
## Ed25519 Program
|
|
69
|
+
|
|
70
|
+
Verify ed25519 signature program. This program takes an ed25519 signature, public key, and message.
|
|
71
|
+
Multiple signatures can be verified. If any of the signatures fail to verify, an error is returned.
|
|
72
|
+
|
|
73
|
+
- Program id: `Ed25519SigVerify111111111111111111111111111`
|
|
74
|
+
- Instructions: [new_ed25519_instruction](https://github.com/solana-labs/solana/blob/master/sdk/src/ed25519_instruction.rs#L45)
|
|
75
|
+
|
|
76
|
+
The ed25519 program processes an instruction. The first `u8` is a count of the number of
|
|
77
|
+
signatures to check, which is followed by a single byte padding. After that, the
|
|
78
|
+
following struct is serialized, one for each signature to check.
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
struct Ed25519SignatureOffsets {
|
|
82
|
+
signature_offset: u16, // offset to ed25519 signature of 64 bytes
|
|
83
|
+
signature_instruction_index: u16, // instruction index to find signature
|
|
84
|
+
public_key_offset: u16, // offset to public key of 32 bytes
|
|
85
|
+
public_key_instruction_index: u16, // instruction index to find public key
|
|
86
|
+
message_data_offset: u16, // offset to start of message data
|
|
87
|
+
message_data_size: u16, // size of message data
|
|
88
|
+
message_instruction_index: u16, // index of instruction data to get message data
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Pseudo code of the operation:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
process_instruction() {
|
|
96
|
+
for i in 0..count {
|
|
97
|
+
// i'th index values referenced:
|
|
98
|
+
instructions = &transaction.message().instructions
|
|
99
|
+
instruction_index = ed25519_signature_instruction_index != u16::MAX ? ed25519_signature_instruction_index : current_instruction;
|
|
100
|
+
signature = instructions[instruction_index].data[ed25519_signature_offset..ed25519_signature_offset + 64]
|
|
101
|
+
instruction_index = ed25519_pubkey_instruction_index != u16::MAX ? ed25519_pubkey_instruction_index : current_instruction;
|
|
102
|
+
pubkey = instructions[instruction_index].data[ed25519_pubkey_offset..ed25519_pubkey_offset + 32]
|
|
103
|
+
instruction_index = ed25519_message_instruction_index != u16::MAX ? ed25519_message_instruction_index : current_instruction;
|
|
104
|
+
message = instructions[instruction_index].data[ed25519_message_data_offset..ed25519_message_data_offset + ed25519_message_data_size]
|
|
105
|
+
if pubkey.verify(signature, message) != Success {
|
|
106
|
+
return Error
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return Success
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Secp256k1 Program
|
|
114
|
+
|
|
115
|
+
Verify secp256k1 public key recovery operations (ecrecover).
|
|
116
|
+
|
|
117
|
+
- Program id: `KeccakSecp256k11111111111111111111111111111`
|
|
118
|
+
- Instructions: [new_secp256k1_instruction](https://github.com/solana-labs/solana/blob/1a658c7f31e1e0d2d39d9efbc0e929350e2c2bcb/sdk/src/secp256k1_instruction.rs#L31)
|
|
119
|
+
|
|
120
|
+
The secp256k1 program processes an instruction which takes in as the first byte
|
|
121
|
+
a count of the following struct serialized in the instruction data:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
struct Secp256k1SignatureOffsets {
|
|
125
|
+
secp_signature_key_offset: u16, // offset to [signature,recovery_id,etherum_address] of 64+1+20 bytes
|
|
126
|
+
secp_signature_instruction_index: u8, // instruction index to find data
|
|
127
|
+
secp_pubkey_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
|
|
128
|
+
secp_signature_instruction_index: u8, // instruction index to find data
|
|
129
|
+
secp_message_data_offset: u16, // offset to start of message data
|
|
130
|
+
secp_message_data_size: u16, // size of message data
|
|
131
|
+
secp_message_instruction_index: u8, // index of instruction data to get message data
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Pseudo code of the operation:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
process_instruction() {
|
|
139
|
+
for i in 0..count {
|
|
140
|
+
// i'th index values referenced:
|
|
141
|
+
instructions = &transaction.message().instructions
|
|
142
|
+
signature = instructions[secp_signature_instruction_index].data[secp_signature_offset..secp_signature_offset + 64]
|
|
143
|
+
recovery_id = instructions[secp_signature_instruction_index].data[secp_signature_offset + 64]
|
|
144
|
+
ref_eth_pubkey = instructions[secp_pubkey_instruction_index].data[secp_pubkey_offset..secp_pubkey_offset + 32]
|
|
145
|
+
message_hash = keccak256(instructions[secp_message_instruction_index].data[secp_message_data_offset..secp_message_data_offset + secp_message_data_size])
|
|
146
|
+
pubkey = ecrecover(signature, recovery_id, message_hash)
|
|
147
|
+
eth_pubkey = keccak256(pubkey[1..])[12..]
|
|
148
|
+
if eth_pubkey != ref_eth_pubkey {
|
|
149
|
+
return Error
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return Success
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
This allows the user to specify any instruction data in the transaction for
|
|
157
|
+
signature and message data. By specifying a special instructions sysvar, one can
|
|
158
|
+
also receive data from the transaction itself.
|
|
159
|
+
|
|
160
|
+
Cost of the transaction will count the number of signatures to verify multiplied
|
|
161
|
+
by the signature cost verify multiplier.
|
|
162
|
+
|
|
163
|
+
### Optimization notes
|
|
164
|
+
|
|
165
|
+
The operation will have to take place after (at least partial) deserialization,
|
|
166
|
+
but all inputs come from the transaction data itself, this allows it to be
|
|
167
|
+
relatively easy to execute in parallel to transaction processing and PoH
|
|
168
|
+
verification.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Sysvar Cluster Data
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Solana exposes a variety of cluster state data to programs via
|
|
6
|
+
[`sysvar`](terminology.md#sysvar) accounts. These accounts are populated at
|
|
7
|
+
known addresses published along with the account layouts in the
|
|
8
|
+
[`solana-program`
|
|
9
|
+
crate](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/sysvar/index.html),
|
|
10
|
+
and outlined below.
|
|
11
|
+
|
|
12
|
+
There are two ways for a program to access a sysvar.
|
|
13
|
+
|
|
14
|
+
The first is to query the sysvar at runtime via the sysvar's `get()` function:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
let clock = Clock::get()
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The following sysvars support `get`:
|
|
21
|
+
- Clock
|
|
22
|
+
- EpochSchedule
|
|
23
|
+
- Fees
|
|
24
|
+
- Rent
|
|
25
|
+
|
|
26
|
+
The second is to pass the sysvar to the program as an account by including its address as one of the accounts in the `Instruction` and then deserializing the data during execution. Access to sysvars accounts is
|
|
27
|
+
always _readonly_.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
let clock_sysvar_info = next_account_info(account_info_iter)?;
|
|
31
|
+
let clock = Clock::from_account_info(&clock_sysvar_info)?;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The first method is more efficient and does not require that the sysvar account be passed to the program, or specified in the `Instruction` the program is processing.
|
|
35
|
+
|
|
36
|
+
## Clock
|
|
37
|
+
|
|
38
|
+
The Clock sysvar contains data on cluster time, including the current slot,
|
|
39
|
+
epoch, and estimated wall-clock Unix timestamp. It is updated every slot.
|
|
40
|
+
|
|
41
|
+
- Address: `SysvarC1ock11111111111111111111111111111111`
|
|
42
|
+
- Layout: [Clock](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/clock/struct.Clock.html)
|
|
43
|
+
- Fields:
|
|
44
|
+
|
|
45
|
+
- `slot`: the current slot
|
|
46
|
+
- `epoch_start_timestamp`: the Unix timestamp of the first slot in this epoch. In the first slot of an epoch, this timestamp is identical to the `unix_timestamp` (below).
|
|
47
|
+
- `epoch`: the current epoch
|
|
48
|
+
- `leader_schedule_epoch`: the most recent epoch for which the leader schedule has already been generated
|
|
49
|
+
- `unix_timestamp`: the Unix timestamp of this slot.
|
|
50
|
+
|
|
51
|
+
Each slot has an estimated duration based on Proof of History. But in reality,
|
|
52
|
+
slots may elapse faster and slower than this estimate. As a result, the Unix
|
|
53
|
+
timestamp of a slot is generated based on oracle input from voting validators.
|
|
54
|
+
This timestamp is calculated as the stake-weighted median of timestamp
|
|
55
|
+
estimates provided by votes, bounded by the expected time elapsed since the
|
|
56
|
+
start of the epoch.
|
|
57
|
+
|
|
58
|
+
More explicitly: for each slot, the most recent vote timestamp provided by
|
|
59
|
+
each validator is used to generate a timestamp estimate for the current slot
|
|
60
|
+
(the elapsed slots since the vote timestamp are assumed to be
|
|
61
|
+
Bank::ns_per_slot). Each timestamp estimate is associated with the stake
|
|
62
|
+
delegated to that vote account to create a distribution of timestamps by
|
|
63
|
+
stake. The median timestamp is used as the `unix_timestamp`, unless the
|
|
64
|
+
elapsed time since the `epoch_start_timestamp` has deviated from the expected
|
|
65
|
+
elapsed time by more than 25%.
|
|
66
|
+
|
|
67
|
+
## EpochSchedule
|
|
68
|
+
|
|
69
|
+
The EpochSchedule sysvar contains epoch scheduling constants that are set in
|
|
70
|
+
genesis, and enables calculating the number of slots in a given epoch, the epoch
|
|
71
|
+
for a given slot, etc. (Note: the epoch schedule is distinct from the [`leader schedule`](terminology.md#leader-schedule))
|
|
72
|
+
|
|
73
|
+
- Address: `SysvarEpochSchedu1e111111111111111111111111`
|
|
74
|
+
- Layout:
|
|
75
|
+
[EpochSchedule](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/epoch_schedule/struct.EpochSchedule.html)
|
|
76
|
+
|
|
77
|
+
## Fees
|
|
78
|
+
|
|
79
|
+
The Fees sysvar contains the fee calculator for the current slot. It is updated
|
|
80
|
+
every slot, based on the fee-rate governor.
|
|
81
|
+
|
|
82
|
+
- Address: `SysvarFees111111111111111111111111111111111`
|
|
83
|
+
- Layout:
|
|
84
|
+
[Fees](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/sysvar/fees/struct.Fees.html)
|
|
85
|
+
|
|
86
|
+
## Instructions
|
|
87
|
+
|
|
88
|
+
The Instructions sysvar contains the serialized instructions in a Message while
|
|
89
|
+
that Message is being processed. This allows program instructions to reference
|
|
90
|
+
other instructions in the same transaction. Read more information on
|
|
91
|
+
[instruction introspection](implemented-proposals/instruction_introspection.md).
|
|
92
|
+
|
|
93
|
+
- Address: `Sysvar1nstructions1111111111111111111111111`
|
|
94
|
+
- Layout:
|
|
95
|
+
[Instructions](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/sysvar/instructions/struct.Instructions.html)
|
|
96
|
+
|
|
97
|
+
## RecentBlockhashes
|
|
98
|
+
|
|
99
|
+
The RecentBlockhashes sysvar contains the active recent blockhashes as well as
|
|
100
|
+
their associated fee calculators. It is updated every slot. Entries are ordered
|
|
101
|
+
by descending block height, so the first entry holds the most recent block hash,
|
|
102
|
+
and the last entry holds an old block hash.
|
|
103
|
+
|
|
104
|
+
- Address: `SysvarRecentB1ockHashes11111111111111111111`
|
|
105
|
+
- Layout:
|
|
106
|
+
[RecentBlockhashes](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/sysvar/recent_blockhashes/struct.RecentBlockhashes.html)
|
|
107
|
+
|
|
108
|
+
## Rent
|
|
109
|
+
|
|
110
|
+
The Rent sysvar contains the rental rate. Currently, the rate is static and set
|
|
111
|
+
in genesis. The Rent burn percentage is modified by manual feature activation.
|
|
112
|
+
|
|
113
|
+
- Address: `SysvarRent111111111111111111111111111111111`
|
|
114
|
+
- Layout:
|
|
115
|
+
[Rent](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/rent/struct.Rent.html)
|
|
116
|
+
|
|
117
|
+
## SlotHashes
|
|
118
|
+
|
|
119
|
+
The SlotHashes sysvar contains the most recent hashes of the slot's parent
|
|
120
|
+
banks. It is updated every slot.
|
|
121
|
+
|
|
122
|
+
- Address: `SysvarS1otHashes111111111111111111111111111`
|
|
123
|
+
- Layout:
|
|
124
|
+
[SlotHashes](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/slot_hashes/struct.SlotHashes.html)
|
|
125
|
+
|
|
126
|
+
## SlotHistory
|
|
127
|
+
|
|
128
|
+
The SlotHistory sysvar contains a bitvector of slots present over the last
|
|
129
|
+
epoch. It is updated every slot.
|
|
130
|
+
|
|
131
|
+
- Address: `SysvarS1otHistory11111111111111111111111111`
|
|
132
|
+
- Layout:
|
|
133
|
+
[SlotHistory](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/slot_history/struct.SlotHistory.html)
|
|
134
|
+
|
|
135
|
+
## StakeHistory
|
|
136
|
+
|
|
137
|
+
The StakeHistory sysvar contains the history of cluster-wide stake activations
|
|
138
|
+
and de-activations per epoch. It is updated at the start of every epoch.
|
|
139
|
+
|
|
140
|
+
- Address: `SysvarStakeHistory1111111111111111111111111`
|
|
141
|
+
- Layout:
|
|
142
|
+
[StakeHistory](https://docs.rs/solana-program/VERSION_FOR_DOCS_RS/solana_program/stake_history/struct.StakeHistory.html)
|