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,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Optimistic Confirmation and Slashing
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Progress on optimistic confirmation can be tracked here
|
|
6
|
+
|
|
7
|
+
https://github.com/solana-labs/solana/projects/52
|
|
8
|
+
|
|
9
|
+
At the end of May, the mainnet-beta is moving to 1.1, and testnet is
|
|
10
|
+
moving to 1.2. With 1.2, testnet will behave as if it has optimistic
|
|
11
|
+
finality as long as at least no more than 4.66% of the validators are
|
|
12
|
+
acting maliciously. Applications can assume that 2/3+ votes observed in
|
|
13
|
+
gossip confirm a block or that at least 4.66% of the network is violating
|
|
14
|
+
the protocol.
|
|
15
|
+
|
|
16
|
+
## How does it work?
|
|
17
|
+
|
|
18
|
+
The general idea is that validators must continue voting following their
|
|
19
|
+
last fork, unless the validator can construct a proof that their current
|
|
20
|
+
fork may not reach finality. The way validators construct this proof is
|
|
21
|
+
by collecting votes for all the forks excluding their own. If the set
|
|
22
|
+
of valid votes represents over 1/3+X of the epoch stake weight, there
|
|
23
|
+
may not be a way for the validators current fork to reach 2/3+ finality.
|
|
24
|
+
The validator hashes the proof (creates a witness) and submits it with
|
|
25
|
+
their vote for the alternative fork. But if 2/3+ votes for the same
|
|
26
|
+
block, it is impossible for any of the validators to construct this proof,
|
|
27
|
+
and therefore no validator is able to switch forks and this block will
|
|
28
|
+
be eventually finalized.
|
|
29
|
+
|
|
30
|
+
## Tradeoffs
|
|
31
|
+
|
|
32
|
+
The safety margin is 1/3+X, where X represents the minimum amount of stake
|
|
33
|
+
that will be slashed in case the protocol is violated. The tradeoff is
|
|
34
|
+
that liveness is now reduced by 2X in the worst case. If more than 1/3 -
|
|
35
|
+
2X of the network is unavailable, the network may stall and will only
|
|
36
|
+
resume finalizing blocks after the network recovers below 1/3 - 2X of
|
|
37
|
+
failing nodes. So far, we haven’t observed a large unavailability hit
|
|
38
|
+
on our mainnet, cosmos, or tezos. For our network, which is primarily
|
|
39
|
+
composed of high availability systems, this seems unlikely. Currently,
|
|
40
|
+
we have set the threshold percentage to 4.66%, which means that if 23.68%
|
|
41
|
+
have failed the network may stop finalizing blocks. For our network,
|
|
42
|
+
which is primarily composed of high availability systems, a 23.68% drop
|
|
43
|
+
in availability seems unlikely. 1:10^12 odds, assuming five 4.7% staked
|
|
44
|
+
nodes with 0.995 uptime.
|
|
45
|
+
|
|
46
|
+
## Security
|
|
47
|
+
|
|
48
|
+
Long term average votes per slot has been 670,000,000 votes / 12,000,000
|
|
49
|
+
slots, or 55 out of 64 voting validators. This includes missed blocks due
|
|
50
|
+
to block producer failures. When a client sees 55/64, or ~86% confirming
|
|
51
|
+
a block, it can expect that ~24% or `(86 - 66.666.. + 4.666..)%` of
|
|
52
|
+
the network must be slashed for this block to fail full finalization.
|
|
53
|
+
|
|
54
|
+
## Why Solana?
|
|
55
|
+
|
|
56
|
+
This approach can be built on other networks, but the implementation
|
|
57
|
+
complexity is significantly reduced on Solana because our votes
|
|
58
|
+
have provable VDF-based timeouts. It’s not clear if switching proofs
|
|
59
|
+
can be easily constructed in networks with weak assumptions about
|
|
60
|
+
time.
|
|
61
|
+
|
|
62
|
+
## Slashing roadmap
|
|
63
|
+
|
|
64
|
+
Slashing is a hard problem, and it becomes harder when the goal of
|
|
65
|
+
the network is to have the lowest possible latency. The tradeoffs are
|
|
66
|
+
especially apparent when optimizing for latency. For example, ideally
|
|
67
|
+
validators should cast and propagate their votes before the
|
|
68
|
+
memory has been synced to disk, which means that the risk of local state
|
|
69
|
+
corruption is much higher.
|
|
70
|
+
|
|
71
|
+
Fundamentally, our goal for slashing is to slash 100% in cases where
|
|
72
|
+
the node is maliciously trying to violate safety rules and 0% during
|
|
73
|
+
routine operation. How we aim to achieve that is to first implement
|
|
74
|
+
slashing proofs without any automatic slashing whatsoever.
|
|
75
|
+
|
|
76
|
+
Right now, for regular consensus, after a safety violation, the
|
|
77
|
+
network will halt. We can analyze the data and figure out who was
|
|
78
|
+
responsible and propose that the stake should be slashed after
|
|
79
|
+
restart. A similar approach will be used with a optimistic conf.
|
|
80
|
+
An optimistic conf safety violation is easily observable, but under
|
|
81
|
+
normal circumstances, an optimistic confirmation safety violation
|
|
82
|
+
may not halt the network. Once the violation has been observed, the
|
|
83
|
+
validators will freeze the affected stake in the next epoch and
|
|
84
|
+
will decide on the next upgrade if the violation requires slashing.
|
|
85
|
+
|
|
86
|
+
In the long term, transactions should be able to recover a portion
|
|
87
|
+
of the slashing collateral if the optimistic safety violation is
|
|
88
|
+
proven. In that scenario, each block is effectively insured by the
|
|
89
|
+
network.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Optimistic Transaction Propagation Signal
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Current Retransmit behavior
|
|
6
|
+
|
|
7
|
+
The retransmission tree currently considers:
|
|
8
|
+
1. epoch staked nodes
|
|
9
|
+
2. tvu peers (filtered by contact info and shred version)
|
|
10
|
+
3. current validator
|
|
11
|
+
|
|
12
|
+
concatenating (1), (2), and (3)
|
|
13
|
+
deduplicating this list of entries by pubkey favoring entries with contact info
|
|
14
|
+
filtering this list by entries with contact info
|
|
15
|
+
|
|
16
|
+
This list is then is randomly shuffled by stake weight.
|
|
17
|
+
|
|
18
|
+
Shreds are then retransmitted to up to FANOUT neighbors and up to FANOUT
|
|
19
|
+
children.
|
|
20
|
+
|
|
21
|
+
## Deterministic retransmission tree
|
|
22
|
+
|
|
23
|
+
`weighted_shuffle` will use a deterministic seed when
|
|
24
|
+
`enable_deterministic_seed` has been enabled based on the triple (shred slot,
|
|
25
|
+
shred index, leader pubkey):
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
if enable_deterministic_seed(self.slot(), root_bank) {
|
|
29
|
+
hashv(&[
|
|
30
|
+
&self.slot().to_le_bytes(),
|
|
31
|
+
&self.index().to_le_bytes(),
|
|
32
|
+
&leader_pubkey.to_bytes(),
|
|
33
|
+
])
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
First, only epoch staked nodes will be considered regardless of presence of
|
|
37
|
+
contact info (and possibly including the validator node itself).
|
|
38
|
+
|
|
39
|
+
A deterministic ordering of the epoch staked nodes will be created based on the
|
|
40
|
+
derministic shred seed using weighted_shuffle.
|
|
41
|
+
|
|
42
|
+
Let `neighbor_set` be selected from up to FANOUT neighbors of the current node.
|
|
43
|
+
Let `child_set` be selected from up to FANOUT children of the current node.
|
|
44
|
+
|
|
45
|
+
Filter `neighbor_set` by contact info.
|
|
46
|
+
Filter `child_set` by contact info.
|
|
47
|
+
|
|
48
|
+
Let `epoch_set` be the union of `neighbor_set` and `child_set`.
|
|
49
|
+
|
|
50
|
+
Let `remaining_set` be all other nodes with contact info not contained in
|
|
51
|
+
`epoch_set`.
|
|
52
|
+
|
|
53
|
+
If `epoch_set.len < 2*FANOUT` then we may randomly select up to
|
|
54
|
+
`2*FANOUT - epoch_set.len` nodes to to retransmit to from `remaining_set`.
|
|
55
|
+
|
|
56
|
+
## Receiving retransmitted shred
|
|
57
|
+
|
|
58
|
+
If the current validator node is not in the set of epoch staked nodes for the
|
|
59
|
+
shred epoch then no early retransmission information can be obtained.
|
|
60
|
+
|
|
61
|
+
Compute the deterministic shred seed.
|
|
62
|
+
|
|
63
|
+
Run the deterministic epoch_stakes shuffle.
|
|
64
|
+
|
|
65
|
+
Find position of self in the neighbor or child sets.
|
|
66
|
+
|
|
67
|
+
Calculate the sum of the stakes of all nodes in the current and prior
|
|
68
|
+
distribution levels.
|
|
69
|
+
|
|
70
|
+
### Stake summation considerations:
|
|
71
|
+
|
|
72
|
+
- Stake sum could include stakes of nodes which had been skipped in prior
|
|
73
|
+
distribution levels because of lack of contact info.
|
|
74
|
+
- Current node was part of original epoch staked shuffle from retransmitter
|
|
75
|
+
but was filtered out because of missing contact info. Current node subsequently
|
|
76
|
+
receives retransmisison of shred and assumes that the retransmit was a result
|
|
77
|
+
of the deterministic tree calculation and not from subsequent random selection.
|
|
78
|
+
This should be benign because the current node will underestimate prior stake
|
|
79
|
+
weight in the retransmission tree.
|
|
80
|
+
|
|
81
|
+
### General considerations:
|
|
82
|
+
|
|
83
|
+
attack by leader (level 0):
|
|
84
|
+
- transmits shred for distribution through the tree as normal
|
|
85
|
+
- additionally transmits shred (or fake shred) directly to node(s) at level >=2
|
|
86
|
+
leading the node(s) to believe a greater percentage of the tree retransmission
|
|
87
|
+
tree had been processed
|
|
88
|
+
|
|
89
|
+
attack by node at level n:
|
|
90
|
+
- retransmits shred to node(s) at level >=n+2 leading the node(s) to believe a
|
|
91
|
+
greater percentage of the tree retransmission tree had been processed
|
|
92
|
+
|
|
93
|
+
### Questions
|
|
94
|
+
|
|
95
|
+
- Should receiving nodes attempt to verify that the origin of the shred was
|
|
96
|
+
retransmitted from the expected node? If so, consideration of spoofing?
|
|
97
|
+
- How is this information consumed?
|
|
98
|
+
|
|
99
|
+
## Notes
|
|
100
|
+
|
|
101
|
+
Practically, signals should fall into the following buckets:
|
|
102
|
+
1. current leader (can signal layer 1 when broadcast is sent)
|
|
103
|
+
2. layer 1
|
|
104
|
+
1.1. can signal layer 1 when shred is received
|
|
105
|
+
1.2. can signal layer 1 + subset of layer 2 when retransmit is sent
|
|
106
|
+
3. layer 2
|
|
107
|
+
3.1. can signal layer 2 when shred is received
|
|
108
|
+
3.2. can signal layer 2 + subset of layer 3 when retrnasmit is sent
|
|
109
|
+
4. current node not a member of epoch staked nodes, no signal can be sent
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Optimistic Confirmation
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Primitives
|
|
6
|
+
|
|
7
|
+
`vote(X, S)` - Votes will be augmented with a "reference" slot, `X`
|
|
8
|
+
which is the **latest** ancestor of this fork that this validator voted on
|
|
9
|
+
with a proof of switching. As long as the validator makes consecutive votes
|
|
10
|
+
that are all descended from each other, the same `X` should be used for all
|
|
11
|
+
those votes. When the validator makes a vote for a slot `s` that is not
|
|
12
|
+
descended from the previous, `X` will be set to the new slot `s`. All votes
|
|
13
|
+
will then be of the form `vote(X, S)`, where `S` is the sorted list of slots
|
|
14
|
+
`(s, s.lockout)` being voted for.
|
|
15
|
+
|
|
16
|
+
Given a vote `vote(X, S)`, let `S.last == vote.last` be the last slot in `S`.
|
|
17
|
+
|
|
18
|
+
Now we define some "Optimistic Slashing" slashing conditions. The intuition
|
|
19
|
+
for these is described below:
|
|
20
|
+
|
|
21
|
+
- `Intuition`: If a validator submits `vote(X, S)`, the same validator
|
|
22
|
+
should not have voted on a different fork that "overlaps" this fork.
|
|
23
|
+
More concretely, this validator should not have cast another vote
|
|
24
|
+
`vote(X', S')` where the range `[X, S.last]` overlaps the range
|
|
25
|
+
`[X', S'.last]`, `X != X'`, as shown below:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
+-------+
|
|
29
|
+
| |
|
|
30
|
+
+---------+ +--------+
|
|
31
|
+
| | | |
|
|
32
|
+
| +-------+ |
|
|
33
|
+
| |
|
|
34
|
+
| |
|
|
35
|
+
| |
|
|
36
|
+
+---+---+ |
|
|
37
|
+
| | |
|
|
38
|
+
X | | |
|
|
39
|
+
| | |
|
|
40
|
+
+---+---+ |
|
|
41
|
+
| |
|
|
42
|
+
| +---+---+
|
|
43
|
+
| | |
|
|
44
|
+
| | | X'
|
|
45
|
+
| | |
|
|
46
|
+
| +---+---+
|
|
47
|
+
| |
|
|
48
|
+
| |
|
|
49
|
+
| |
|
|
50
|
+
| |
|
|
51
|
+
| +---+---+
|
|
52
|
+
| | |
|
|
53
|
+
| | | S'.last
|
|
54
|
+
| | |
|
|
55
|
+
| +-------+
|
|
56
|
+
|
|
|
57
|
+
+---+---+
|
|
58
|
+
| |
|
|
59
|
+
s | |
|
|
60
|
+
| |
|
|
61
|
+
+---+---+
|
|
62
|
+
|
|
|
63
|
+
|
|
|
64
|
+
|
|
|
65
|
+
|
|
|
66
|
+
+---+---+
|
|
67
|
+
| |
|
|
68
|
+
S.last | |
|
|
69
|
+
| |
|
|
70
|
+
+-------+
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
(Example of slashable votes vote(X', S') and vote(X, S))
|
|
74
|
+
|
|
75
|
+
In the diagram above, note that the vote for `S.last` must have been sent after
|
|
76
|
+
the vote for `S'.last` (due to lockouts, the higher vote must have been sent
|
|
77
|
+
later). Thus, the sequence of votes must have been: `X ... S'.last ... S.last`.
|
|
78
|
+
This means after the vote on `S'.last`, the validator must have switched back
|
|
79
|
+
to the other fork at some slot `s > S'.last > X`. Thus, the vote for `S.last`
|
|
80
|
+
should have used `s` as the "reference" point, not `X`, because that was the
|
|
81
|
+
last "switch" on the fork.
|
|
82
|
+
|
|
83
|
+
To enforce this, we define the "Optimistic Slashing" slashing conditions. Given
|
|
84
|
+
any two distinct votes `vote(X, S)`and `vote(X', S')` by the same validator,
|
|
85
|
+
the votes must satisfy:
|
|
86
|
+
|
|
87
|
+
- `X <= S.last`, `X' <= S'.last`
|
|
88
|
+
- All `s` in `S` are ancestors/descendants of one another,
|
|
89
|
+
all `s'` in `S'` are ancsestors/descendants of one another,
|
|
90
|
+
-
|
|
91
|
+
- `X == X'` implies `S` is parent of `S'` or `S'` is a parent of `S`
|
|
92
|
+
- `X' > X` implies `X' > S.last` and `S'.last > S.last`
|
|
93
|
+
and for all `s` in `S`, `s + lockout(s) < X'`
|
|
94
|
+
- `X > X'` implies `X > S'.last` and `S.last > S'.last`
|
|
95
|
+
and for all `s` in `S'`, `s + lockout(s) < X`
|
|
96
|
+
|
|
97
|
+
(The last two rules imply the ranges cannot overlap):
|
|
98
|
+
Otherwise the validator is slashed.
|
|
99
|
+
|
|
100
|
+
`Range(vote)` - Given a vote `v = vote(X, S)`, define `Range(v)` to be the range
|
|
101
|
+
of slots `[X, S.last]`.
|
|
102
|
+
|
|
103
|
+
`SP(old_vote, new_vote)` - This is the "Switching Proof" for `old_vote`, the
|
|
104
|
+
validator's latest vote. Such a proof is necessary anytime a validator switches
|
|
105
|
+
their "reference" slot (see vote section above). The switching proof includes
|
|
106
|
+
a reference to `old_vote`, so that there's a record of what the "range" of that
|
|
107
|
+
`old_vote` was (to make other conflicting switches in this range slashable).
|
|
108
|
+
Such a switch must still respect lockouts.
|
|
109
|
+
|
|
110
|
+
A switching proof shows that `> 1/3` of the network is locked out at slot
|
|
111
|
+
`old_vote.last`.
|
|
112
|
+
|
|
113
|
+
The proof is a list of elements `(validator_id, validator_vote(X, S))`, where:
|
|
114
|
+
|
|
115
|
+
1. The sum of the stakes of all the validator id's `> 1/3`
|
|
116
|
+
|
|
117
|
+
2. For each `(validator_id, validator_vote(X, S))`, there exists some slot `s`
|
|
118
|
+
in `S` where:
|
|
119
|
+
_ a.`s` is not a common ancestor of both `validator_vote.last` and
|
|
120
|
+
`old_vote.last` and `new_vote.last`.
|
|
121
|
+
_ b. `s` is not a descendant of `validator_vote.last`. \* c. `s + s.lockout() >= old_vote.last` (implies validator is still locked
|
|
122
|
+
out on slot `s` at slot `old_vote.last`).
|
|
123
|
+
|
|
124
|
+
Switching forks without a valid switching proof is slashable.
|
|
125
|
+
|
|
126
|
+
## Definitions:
|
|
127
|
+
|
|
128
|
+
Optimistic Confirmation - A block `B` is then said to have achieved
|
|
129
|
+
"optimistic confirmation" if `>2/3` of stake have voted with votes `v`
|
|
130
|
+
where `Range(v)` for each such `v` includes `B.slot`.
|
|
131
|
+
|
|
132
|
+
Finalized - A block `B` is said to be finalized if at least one
|
|
133
|
+
correct validator has rooted `B` or a descendant of `B`.
|
|
134
|
+
|
|
135
|
+
Reverted - A block `B` is said to be reverted if another block `B'` that
|
|
136
|
+
is not a parent or descendant of `B` was finalized.
|
|
137
|
+
|
|
138
|
+
## Guarantees:
|
|
139
|
+
|
|
140
|
+
A block `B` that has reached optimistic confirmation will not be reverted
|
|
141
|
+
unless at least one validator is slashed.
|
|
142
|
+
|
|
143
|
+
## Proof:
|
|
144
|
+
|
|
145
|
+
Assume for the sake of contradiction, a block `B` has achieved
|
|
146
|
+
`optimistic confirmation` at some slot `B + n` for some `n`, and:
|
|
147
|
+
|
|
148
|
+
- Another block `B'` that is not a parent or descendant of `B`
|
|
149
|
+
was finalized.
|
|
150
|
+
- No validators violated any slashing conditions.
|
|
151
|
+
|
|
152
|
+
By the definition of `optimistic confirmation`, this means `> 2/3` of validators
|
|
153
|
+
have each shown some vote `v` of the form `Vote(X, S)` where `X <= B <= v.last`.
|
|
154
|
+
Call this set of validators the `Optimistic Validators`.
|
|
155
|
+
|
|
156
|
+
Now given a validator `v` in `Optimistic Validators`, given two votes made by
|
|
157
|
+
`v`, `Vote(X, S)` and `Vote(X', S')` where `X <= B <= S.last`, and
|
|
158
|
+
`X' <= B <= S'.last`, then `X == X'` otherwise an "Optimistic Slashing" condition
|
|
159
|
+
is violated (the "ranges" of each vote would overlap at `B`).
|
|
160
|
+
|
|
161
|
+
Thus define the `Optimistic Votes` to be the set of votes made by
|
|
162
|
+
`Optimistic Validators`, where for each optimistic validator `v`, the vote made
|
|
163
|
+
by `v` included in the set is the `maximal` vote `Vote(X, S)` with the
|
|
164
|
+
greatest `S.last` out of any votes made by `v` that satisfy `X <= B <= S.last`.
|
|
165
|
+
Because we know from above `X` for all such votes made by `v` is unique, we know
|
|
166
|
+
there is such a unique `maximal` vote.
|
|
167
|
+
|
|
168
|
+
### Lemma 1:
|
|
169
|
+
|
|
170
|
+
`Claim:` Given a vote `Vote(X, S)` made by a validator `V` in the
|
|
171
|
+
`Optimistic Validators` set, and `S` contains a vote for a slot `s`
|
|
172
|
+
for which:
|
|
173
|
+
|
|
174
|
+
- `s + s.lockout > B`,
|
|
175
|
+
- `s` is not an ancestor or descendant of `B`,
|
|
176
|
+
|
|
177
|
+
then `X > B`.
|
|
178
|
+
|
|
179
|
+
```text
|
|
180
|
+
+-------+
|
|
181
|
+
| |
|
|
182
|
+
+---------+ +--------+
|
|
183
|
+
| | | |
|
|
184
|
+
| +-------+ |
|
|
185
|
+
| |
|
|
186
|
+
| |
|
|
187
|
+
| |
|
|
188
|
+
| +---+---+
|
|
189
|
+
| | |
|
|
190
|
+
| | | X'
|
|
191
|
+
| | |
|
|
192
|
+
| +---+---+
|
|
193
|
+
| |
|
|
194
|
+
| |
|
|
195
|
+
| +---+---+
|
|
196
|
+
| | |
|
|
197
|
+
| | | B (Optimistically Confirmed)
|
|
198
|
+
| | |
|
|
199
|
+
| +---+---+
|
|
200
|
+
| |
|
|
201
|
+
| |
|
|
202
|
+
| |
|
|
203
|
+
| +---+---+
|
|
204
|
+
| | |
|
|
205
|
+
| | | S'.last
|
|
206
|
+
| | |
|
|
207
|
+
| +-------+
|
|
208
|
+
|
|
|
209
|
+
+---+---+
|
|
210
|
+
| |
|
|
211
|
+
X | |
|
|
212
|
+
| |
|
|
213
|
+
+---+---+
|
|
214
|
+
|
|
|
215
|
+
|
|
|
216
|
+
|
|
|
217
|
+
|
|
|
218
|
+
|
|
|
219
|
+
|
|
|
220
|
+
+---+---+
|
|
221
|
+
| |
|
|
222
|
+
S.last | |
|
|
223
|
+
| |
|
|
224
|
+
+---+---+
|
|
225
|
+
|
|
|
226
|
+
|
|
|
227
|
+
|
|
|
228
|
+
|
|
|
229
|
+
+---+---+
|
|
230
|
+
| |
|
|
231
|
+
s + s.lockout | |
|
|
232
|
+
+-------+
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
`Proof`: Assume for the sake of contradiction a validator `V` from the
|
|
236
|
+
"Optimistic Validators" set made such a vote `Vote(X, S)` where `S` contains
|
|
237
|
+
a vote for a slot `s` not an ancestor or descendant of `B`, where
|
|
238
|
+
`s + s.lockout > B`, but `X <= B`.
|
|
239
|
+
|
|
240
|
+
Let `Vote(X', S')` be the vote in `Optimistic Votes` set made by validator `V`.
|
|
241
|
+
By definition of that set (all votes optimistically confirmed `B`),
|
|
242
|
+
`X' <= B <= S'.last` (see diagram above).
|
|
243
|
+
|
|
244
|
+
This implies that because it's assumed above `X <= B`, then `X <= S'.last`,
|
|
245
|
+
so by the slashing rules, either `X == X'` or `X < X'` (otherwise would
|
|
246
|
+
overlap the range `(X', S'.last)`).
|
|
247
|
+
|
|
248
|
+
`Case X == X'`:
|
|
249
|
+
|
|
250
|
+
Consider `s`. We know `s != X` because it is assumed `s` is not an ancestor
|
|
251
|
+
or descendant of `B`, and `X` is an ancestor of `B`. Because `S'.last` is a
|
|
252
|
+
descendant of `B`, this means `s` is also not an ancestor or descendant of
|
|
253
|
+
`S'.last`. Then because `S.last` is descended from `s`, then `S'.last` cannot
|
|
254
|
+
be an ancestor or descendant of `S.last` either. This implies `X != X'` by the
|
|
255
|
+
"Optimistic Slashing" rules.
|
|
256
|
+
|
|
257
|
+
`Case X < X'`:
|
|
258
|
+
|
|
259
|
+
Intuitively, this implies that `Vote(X, S)` was made "before" `Vote(X', S')`.
|
|
260
|
+
|
|
261
|
+
From the assumption above, `s + s.lockout > B > X'`. Because `s` is not an
|
|
262
|
+
ancestor of `X'`, lockouts would have been violated when this validator
|
|
263
|
+
first attempted to submit a switching vote to `X'` with some vote of the
|
|
264
|
+
form `Vote(X', S'')`.
|
|
265
|
+
|
|
266
|
+
Since none of these cases are valid, the assumption must have been invalid,
|
|
267
|
+
and the claim is proven.
|
|
268
|
+
|
|
269
|
+
### Lemma 2:
|
|
270
|
+
|
|
271
|
+
Recall `B'` was the block finalized on a different fork than
|
|
272
|
+
"optimistically" confirmed" block `B`.
|
|
273
|
+
|
|
274
|
+
`Claim`: For any vote `Vote(X, S)` in the `Optimistic Votes` set, it must be
|
|
275
|
+
true that `B' > X`
|
|
276
|
+
|
|
277
|
+
```text
|
|
278
|
+
+-------+
|
|
279
|
+
| |
|
|
280
|
+
+--------+ +---------+
|
|
281
|
+
| | | |
|
|
282
|
+
| +-------+ |
|
|
283
|
+
| |
|
|
284
|
+
| |
|
|
285
|
+
| |
|
|
286
|
+
| +---+---+
|
|
287
|
+
| | |
|
|
288
|
+
| | | X
|
|
289
|
+
| | |
|
|
290
|
+
| +---+---+
|
|
291
|
+
| |
|
|
292
|
+
| |
|
|
293
|
+
| +---+---+
|
|
294
|
+
| | |
|
|
295
|
+
| | | B (Optimistically Confirmed)
|
|
296
|
+
| | |
|
|
297
|
+
| +---+---+
|
|
298
|
+
| |
|
|
299
|
+
| |
|
|
300
|
+
| |
|
|
301
|
+
| +---+---+
|
|
302
|
+
| | |
|
|
303
|
+
| | | S.last
|
|
304
|
+
| | |
|
|
305
|
+
| +-------+
|
|
306
|
+
|
|
|
307
|
+
+---+---+
|
|
308
|
+
| |
|
|
309
|
+
B'(Finalized) | |
|
|
310
|
+
| |
|
|
311
|
+
+-------+
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
`Proof`: Let `Vote(X, S)` be a vote in the `Optimistic Votes` set. Then by
|
|
315
|
+
definition, given the "optimistcally confirmed" block `B`, `X <= B <= S.last`.
|
|
316
|
+
|
|
317
|
+
Because `X` is a parent of `B`, and `B'` is not a parent or ancestor of `B`,
|
|
318
|
+
then:
|
|
319
|
+
|
|
320
|
+
- `B' != X`
|
|
321
|
+
- `B'` is not a parent of `X`
|
|
322
|
+
|
|
323
|
+
Now consider if `B'` < `X`:
|
|
324
|
+
|
|
325
|
+
`Case B' < X`: We wll show this is a violation of lockouts.
|
|
326
|
+
From above, we know `B'` is not a parent of `X`. Then because `B'` was rooted,
|
|
327
|
+
and `B'` is not a parent of `X`, then the validator should not have been able
|
|
328
|
+
to vote on the higher slot `X` that does not descend from `B'`.
|
|
329
|
+
|
|
330
|
+
### Proof of Safety:
|
|
331
|
+
|
|
332
|
+
We now aim to show at least one of the validators in the
|
|
333
|
+
`Optimistic Validators` set violated a slashing rule.
|
|
334
|
+
|
|
335
|
+
First note that in order for `B'` to have been rooted, there must have been
|
|
336
|
+
`> 2/3` stake that voted on `B'` or a descendant of `B'`. Given that the
|
|
337
|
+
`Optimistic Validator` set also contains `> 2/3` of the staked validators,
|
|
338
|
+
it follows that `> 1/3` of the staked validators:
|
|
339
|
+
|
|
340
|
+
- Rooted `B'` or a descendant of `B'`
|
|
341
|
+
- Also submitted a vote `v` of the form `Vote(X, S)` where `X <= B <= v.last`.
|
|
342
|
+
|
|
343
|
+
Let the `Delinquent` set be the set of validators that meet the above
|
|
344
|
+
criteria.
|
|
345
|
+
|
|
346
|
+
By definition, in order to root `B'`, each validator `V` in `Delinquent`
|
|
347
|
+
must have each made some "switching vote" of the form `Vote(X_v, S_v)` where:
|
|
348
|
+
|
|
349
|
+
- `S_v.last > B'`
|
|
350
|
+
- `S_v.last` is a descendant of `B'`, so it can't be a descendant of `B`
|
|
351
|
+
- Because `S_v.last` is not a descendant of `B`, then `X_v` cannot be a
|
|
352
|
+
descendant or ancestor of `B`.
|
|
353
|
+
|
|
354
|
+
By definition, this delinquent validator `V` also made some vote `Vote(X, S)`
|
|
355
|
+
in the `Optimistic Votes` where by definition of that set (optimistically
|
|
356
|
+
confirmed `B`), we know `S.last >= B >= X`.
|
|
357
|
+
|
|
358
|
+
By `Lemma 2` we know `B' > X`, and from above `S_v.last > B'`, so then
|
|
359
|
+
`S_v.last > X`. Because `X_v != X` (cannot be a descendant or ancestor of
|
|
360
|
+
`B` from above), then by the slashing rules then, we know `X_v > S.last`.
|
|
361
|
+
From above, `S.last >= B >= X` so for all such "switching votes", `X_v > B`.
|
|
362
|
+
|
|
363
|
+
Now ordering all these "switching votes" in time, let `V` to be the validator
|
|
364
|
+
in `Optimistic Validators` that first submitted such a "swtching vote"
|
|
365
|
+
`Vote(X', S')`, where `X' > B`. We know that such a validator exists because
|
|
366
|
+
we know from above that all delinquent validators must have submitted such
|
|
367
|
+
a vote, and the delinquent validators are a subset of the
|
|
368
|
+
`Optimistic Validators`.
|
|
369
|
+
|
|
370
|
+
Let `Vote(X, S)` be the unique vote in `Optimistic Votes` made by
|
|
371
|
+
validator `V` (maximizing `S.last`).
|
|
372
|
+
|
|
373
|
+
Given `Vote(X, S)` because `X' > B >= X`, then `X' > X`, so
|
|
374
|
+
by the "Optimistic Slashing" rules, `X' > S.last`.
|
|
375
|
+
|
|
376
|
+
In order to perform such a "switching vote" to `X'`, a switching proof
|
|
377
|
+
`SP(Vote(X, S), Vote(X', S'))` must show `> 1/3` of stake being locked
|
|
378
|
+
out at this validator's latest vote, `S.last`. Combine this `>1/3` with the
|
|
379
|
+
fact that the set of validators in the `Optimistic Voters` set consists of
|
|
380
|
+
`> 2/3` of the stake, implies at least one optimistic validator `W` from the
|
|
381
|
+
`Optimistic Voters` set must have submitted a vote (recall the definition of
|
|
382
|
+
a switching proof),`Vote(X_w, S_w)` that was included in validator `V`'s
|
|
383
|
+
switching proof for slot `X'`, where `S_w` contains a slot `s` such that:
|
|
384
|
+
|
|
385
|
+
- `s` is not a common ancestor of `S.last` and `X'`
|
|
386
|
+
- `s` is not a descendant of `S.last`.
|
|
387
|
+
- `s' + s'.lockout > S.last`
|
|
388
|
+
|
|
389
|
+
Because `B` is an ancestor of `S.last`, it is also true then:
|
|
390
|
+
|
|
391
|
+
- `s` is not a common ancestor of `B` and `X'`
|
|
392
|
+
- `s' + s'.lockout > B`
|
|
393
|
+
|
|
394
|
+
which was included in `V`'s switching proof.
|
|
395
|
+
|
|
396
|
+
Now because `W` is also a member of `Optimistic Voters`, then by the `Lemma 1`
|
|
397
|
+
above, given a vote by `W`, `Vote(X_w, S_w)`, where `S_w` contains a vote for
|
|
398
|
+
a slot `s` where `s + s.lockout > B`, and `s` is not an ancestor of `B`, then
|
|
399
|
+
`X_w > B`.
|
|
400
|
+
|
|
401
|
+
Because validator `V` included vote `Vote(X_w, S_w)` in its proof of switching
|
|
402
|
+
for slot `X'`, then his implies validator `V'` submitted vote `Vote(X_w, S_w)`
|
|
403
|
+
**before** validator `V` submitted its switching vote for slot `X'`,
|
|
404
|
+
`Vote(X', S')`.
|
|
405
|
+
|
|
406
|
+
But this is a contradiction because we chose `Vote(X', S')` to be the first vote
|
|
407
|
+
made by any validator in the `Optimistic Voters` set where `X' > B` and `X'` is
|
|
408
|
+
not a descendant of `B`.
|