mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 00:37:57 +00:00
002d9260f9
**Update:** Pushed additional changes based on the review comments. **This pull request fixes various spelling mistakes in this repository.** Most of the changes are contained in the first **3** commits: - `Fix spelling mistakes in comments and docs` - `Fix spelling mistakes in test names` - `Fix spelling mistakes in error messages, panic messages, logs and tracing` Other source code spelling mistakes are separated into individual commits for easier reviewing: - `Fix the spelling of 'authority'` - `Fix the spelling of 'REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY'` - `Fix the spelling of 'prev_enqueud_messages'` - `Fix the spelling of 'endpoint'` - `Fix the spelling of 'children'` - `Fix the spelling of 'PenpalSiblingSovereignAccount'` - `Fix the spelling of 'PenpalSudoAccount'` - `Fix the spelling of 'insufficient'` - `Fix the spelling of 'PalletXcmExtrinsicsBenchmark'` - `Fix the spelling of 'subtracted'` - `Fix the spelling of 'CandidatePendingAvailability'` - `Fix the spelling of 'exclusive'` - `Fix the spelling of 'until'` - `Fix the spelling of 'discriminator'` - `Fix the spelling of 'nonexistent'` - `Fix the spelling of 'subsystem'` - `Fix the spelling of 'indices'` - `Fix the spelling of 'committed'` - `Fix the spelling of 'topology'` - `Fix the spelling of 'response'` - `Fix the spelling of 'beneficiary'` - `Fix the spelling of 'formatted'` - `Fix the spelling of 'UNKNOWN_PROOF_REQUEST'` - `Fix the spelling of 'succeeded'` - `Fix the spelling of 'reopened'` - `Fix the spelling of 'proposer'` - `Fix the spelling of 'InstantiationNonce'` - `Fix the spelling of 'depositor'` - `Fix the spelling of 'expiration'` - `Fix the spelling of 'phantom'` - `Fix the spelling of 'AggregatedKeyValue'` - `Fix the spelling of 'randomness'` - `Fix the spelling of 'defendant'` - `Fix the spelling of 'AquaticMammal'` - `Fix the spelling of 'transactions'` - `Fix the spelling of 'PassingTracingSubscriber'` - `Fix the spelling of 'TxSignaturePayload'` - `Fix the spelling of 'versioning'` - `Fix the spelling of 'descendant'` - `Fix the spelling of 'overridden'` - `Fix the spelling of 'network'` Let me know if this structure is adequate. **Note:** The usage of the words `Merkle`, `Merkelize`, `Merklization`, `Merkelization`, `Merkleization`, is somewhat inconsistent but I left it as it is. ~~**Note:** In some places the term `Receival` is used to refer to message reception, IMO `Reception` is the correct word here, but I left it as it is.~~ ~~**Note:** In some places the term `Overlayed` is used instead of the more acceptable version `Overlaid` but I also left it as it is.~~ ~~**Note:** In some places the term `Applyable` is used instead of the correct version `Applicable` but I also left it as it is.~~ **Note:** Some usage of British vs American english e.g. `judgement` vs `judgment`, `initialise` vs `initialize`, `optimise` vs `optimize` etc. are both present in different places, but I suppose that's understandable given the number of contributors. ~~**Note:** There is a spelling mistake in `.github/CODEOWNERS` but it triggers errors in CI when I make changes to it, so I left it as it is.~~
87 lines
3.1 KiB
Markdown
87 lines
3.1 KiB
Markdown
# 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.
|
|
|
|
```bash
|
|
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.
|
|
|
|
```bash
|
|
cargo run --release build-spec --chain=sc_init.json --raw > sc.json
|
|
```
|
|
|
|
Run a few validator nodes.
|
|
|
|
```bash
|
|
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.
|
|
|
|
```bash
|
|
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.
|
|
|
|
```js
|
|
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
|
|
|
|
```bash
|
|
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 transaction, and index is the index of that transaction
|
|
in the block.
|
|
|
|
|
|
License: Apache-2.0
|