PotDrive
Open Drive

New on Portaldot V3

Storage, built into the chain.

PotDrive puts your files straight into Portaldot's own TransactionStorage. One signature to store. Every byte checked by the browser that reads it.

On chain
Hashing in your browser
Reading…
≤ 1 MiB each
    Content ID · blake2b-256
    Waiting for every block…
    Hashed locally. Nothing is uploaded from here.

    The journey of a file

    01 / 06

    It starts as one file. 

    A PDF, a photo, a whole website. Nothing has left your device yet.

    File · 3.4 MiB
    ↓Scroll to follow it
    1
    signature

    Per upload, whatever the size. The rest is signed by a temporary key in your tab.

    7
    days

    Kept and proven by validators per payment, then renewable by anyone.

    0
    servers to trust

    Readers fetch from the chain and verify every block against its hash.

    The unused pallet

    It shipped in V3. Nobody had stored a thing.

    Portaldot V3 runs TransactionStorage, the same pallet behind Polkadot's Bulletin chain. When we looked on 17 October 2026 it held zero entries. No SDK, no gateway, no app. Teams on Portaldot were sending their files to outside pinning services instead.

    Blocks holding data right now
    …
    TransactionStorage.Transactions · live

    Four steps. One question.

    From your disk to a validator, and back to anyone with the link.

    Prepared on your device.

    FastCDC cuts your file where its content says to, not every N bytes, then hashes each piece with blake2b-256, the hash Portaldot indexes. Blocks the chain already holds are skipped.

    FastCDC · blake2b-256 · dag-pb · dedup

    One signature.

    A single batch funds a temporary upload key and records the file in the PotDrive registry on Revive. Your wallet asks once.

    utility.batchAll · revive.call

    Stored by the chain.

    The upload key writes each block with transactionStorage.store, then sends whatever it didn't spend back to you.

    transactionStorage.store × n

    Checked, not trusted.

    Your browser pulls every block back over bitswap and re-hashes it. A block only counts once its hash matches.

    bitswap_v1_get → re-hash

    Engineered for a chain that charges by the byte.

    Storage on Portaldot costs about 105 tPOT per MiB. So PotDrive never stores the same byte twice.

    Versions pay for changes only.

    Content-defined chunking keeps chunk boundaries stable across edits. Insert 1 KiB into a 16 MiB file and FastCDC stores 609 KiB again; fixed chunks would store all 16 MiB.

    Websites, served from the chain.

    potdrive deploy ./dist stores a UnixFS directory. The gateway resolves paths block by block and runs the site in a sandboxed origin.

    Streaming with Range.

    The gateway maps a byte range to just the chunks that cover it, so video seeks without downloading what came before.

    Gasless with MetaTx.

    No tPOT yet? Sign one authorization and a relay pays the fees through Portaldot's MetaTx pallet.

    NFTs, fully on Portaldot.

    Mint on the native Nfts pallet in one signature. The media is stored by Portaldot itself, not a pinning service.

    Share with a wallet.

    Seal a private file's key to another address with X25519 inbox keys. No link to leak.

    Private by choice.

    AES-256-GCM in your browser before upload. The chain only sees ciphertext. The key lives in the link, after the #.

    Keep-alive.

    Prepay renewals and a daily keeper renews your file before Portaldot drops it, reimbursed exactly, capped per file.

    Verified everywhere.

    The Drive, the gateway, the SDK and the CLI all re-hash every block before they use it.

    Why native.

    Portaldot already pays validators to keep and prove data.

    PotDrivePinning serviceCloud bucket
    Held by the network you already use
    Storage proofs inside the runtime
    Standard IPFS content IDs
    Readers verify every byte themselves
    No extra account or API key
    Who holds the bytesPortaldot validatorsA pinning companyOne cloud provider

    Made of Portaldot.

    No new chain, no new token. Native pallets hold the bytes. Solidity on Revive keeps the index.

    TransactionStorage
    store · renew · checkProof

    Holds each block for 100,800 blocks. Validators must keep proving they have it.

    Bitswap RPC
    bitswap_v1_get

    Returns any stored block by CID. The read path for every client.

    Revive
    PotDriveRegistry.sol

    Ownership and keep-alive. EVM bytecode, called from a Polkadot wallet.

    Utility + Balances
    batchAll · transferAll

    Turns many transactions into one signature, and returns the change.

    System precompile
    hashBlake256 · sr25519Verify

    Solidity hashes with Portaldot's blake2b and checks wallet signatures, so the registry proves files.

    MetaTx
    metaTx.dispatch

    Gasless uploads: one readable wallet signature, and a relay pays every fee.

    For developers

    For every other Portaldot app.

    An SDK, React components, a CLI and an IPFS-style gateway. Point an image tag at a CID and it loads from Portaldot.

    Install
    import { connect, prepareFile, uploadFile } from "@potdrive/sdk";
    
    const api = await connect();
    const file = await prepareFile(bytes, { name: "deck.pdf", mime: "application/pdf" });
    
    const { root } = await uploadFile({
      api,
      file,
      owner: { address, signer }, // any Polkadot wallet
      registry: REGISTRY,
      onEvent: (e) => console.log(e.type),
    });
    
    console.log(`https://potdrive.anshverma.tech/ipfs/${root}`);
    Portaldot V3 testnetTypeScript

    Questions, answered.

    The things people ask before they store their first file.

    In Portaldot itself. Each block goes into the runtime's TransactionStorage pallet, and validators keep it. There is no PotDrive server holding a copy, and no outside pinning service.

    Live on the Portaldot V3 testnet

    Put something on Portaldot that isn't a transfer.

    Drop a file, sign once, and share a link anyone can verify.