Files
pezkuwi-subxt/substrate/frame/transaction-storage
dharjeezy 1b0be8ae06 Replace parameter_types with ConstU32 &c. (#10402)
* remove parameter types and use const type

* remove parameter types and use const type

* Delete {

* Delete count,

* refractor for beefy, benchmarking, child bounties, and collective pallets

* refractor for pallet contracts

* refractor for elections

* refractor for more pallets

* fix CI issues

* fix CI issues

* fix CI issues

* fix CI issues

* remove warning to fix CI issue

* remove warning to fix CI issue
refractor for pallet preimage

* remove warning to fix CI issue
refractor for pallet proxy

* remove warning to fix CI issue
refractor for pallet recovery
refractor for pallet randomness-collective-flip

* remove warning to fix CI issue
refractor for pallet scored-pool
refractor for pallet scheduler
refractor for pallet session

* remove warning to fix CI issue
refractor for pallet society, support, system, timestamp, tips

* remove warning to fix CI issue
refractor for pallet transaction_payment, transaction_storage, treasury, uniques, utility

* remove warning to fix CI issue

* cargo +nightly fmt

* CI fix

* more param refractor on beefy-mmr

* refractor for beefy

* Update frame/babe/src/mock.rs

* Update frame/babe/src/mock.rs

* Update frame/bounties/src/tests.rs

* Update frame/tips/src/tests.rs

* Delete mock.rs

* Update frame/examples/basic/src/tests.rs

* Apply suggestions from code review

* Update frame/im-online/src/mock.rs

* Update frame/im-online/src/mock.rs

* Update frame/offences/benchmarking/src/mock.rs

* Update frame/session/benchmarking/src/mock.rs

* Update frame/support/test/tests/pallet_compatibility.rs

* Update frame/support/test/tests/pallet_compatibility_instance.rs

* Update frame/treasury/src/tests.rs

* Update test-utils/runtime/src/lib.rs

* some cleanup

* fmt

* remove unused

Co-authored-by: Damilare <dakinlose@teamapt.com>
Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com>
2021-12-16 03:06:11 +00:00
..
2021-08-05 12:07:23 +00:00

Transaction Storage Pallet

Indexes transactions and manages storage proofs.

Allows storing arbitrary data on the chain. Data is automatically removed after StoragePeriod blocks, unless the storage is renewed. Validators must submit proof of storing a random chunk of data for block N - StoragePeriod when producing block N.

Running a chain

The following describes how to set up a new storage chain.

Start with generating a chain spec.

cargo run --release -- build-spec --chain=local > sc_init.json

Edit the json chain spec file to customise the chain. The storage chain genesis params are configured in the transactionStorage section. Note that storagePeriod is specified in blocks and changing it also requires code changes at the moment.

Build a raw spec from the init spec.

cargo run --release build-spec --chain=sc_init.json --raw > sc.json

Run a few validator nodes.

cargo run --release -- --chain=sc.json -d /tmp/alice --storage-chain --keep-blocks=100800 --ipfs-server --validator --alice
cargo run --release -- --chain=sc.json -d /tmp/bob --storage-chain --keep-blocks=100800 --ipfs-server --validator --bob

--storage-chain enables transaction indexing. --keep-blocks=100800 enables block pruning. The value here should be greater or equal than the storage period. --ipfs-server enables serving stored content over IPFS.

Once the network is started, any other joining nodes need to sync with --sync=fast. Regular sync will fail because block pruning removes old blocks. The chain does not keep full block history.

cargo run --release -- --chain=sc.json -d /tmp/charlie --storage-chain --keep-blocks=100800 --ipfs-server --validator --charlie --sync=fast

Making transactions

To store data use the transactionStorage.store extrinsic. And IPFS CID can be generated from the Blake2-256 hash of the data.

const util_crypto = require('@polkadot/util-crypto');
const keyring_api = require('@polkadot/keyring');
const polkadot_api = require('@polkadot/api');
const fs = require('fs');
const multihash = require('multihashes');
const CID = require('cids')

const wsProvider = new polkadot_api.WsProvider();
const api = await polkadot_api.ApiPromise.create({ provider: wsProvider });

const keyring = new keyring_api.Keyring({ type: "sr25519" });
const alice = keyring.addFromUri("//Alice");

const file = fs.readFileSync('cute_kitten.jpeg');
const hash = util_crypto.blake2AsU8a(file)
const encoded_hash = multihash.encode(hash, 'blake2b-256');

const cid = new CID(1, 'blake2b-256', encoded_hash)
console.log(cid.toString());

const txHash = await api.tx.transactionStorage.store('0x' + file.toString('hex')).signAndSend(alice);

Data can be queried over IPFS

ipfs swarm connect <substrate peer address>
ipfs block get /ipfs/<CID> > kitten.jpeg

To renew data and prevent it from being disposed after the storage period, use transactionStorage.renew(block, index) where block is the block number of the previous store or renew transction, and index is the index of that transaction in the block.

License: Apache-2.0