git.delta.rocks / unique-network / refs/commits / 8e8f09e20e76

difftreelog

First benchmark

str-mv2020-10-21parent: #0cdaf2e.patch.diff
in: master

7 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3733,6 +3733,7 @@
 name = "pallet-nft"
 version = "2.0.0"
 dependencies = [
+ "frame-benchmarking",
  "frame-support",
  "frame-system",
  "log",
modifiedREADME.mddiffbeforeafterboth
before · README.md
1![Docker build](https://github.com/usetech-llc/nft_parachain/workflows/Docker%20build/badge.svg)23# NFT Parachain45## Project Description67The NFT Pallet is the core of NFT functionality. Like ERC-721 standard in Ethereum ecosystem, this pallet provides the basement for creating collections of unique non-divisible things, also called Non Fungible Tokens (NFTs), minting NFT of a given Collection, and managing their ownership.89The pallet also enables storing NFT properties. Though (according to ERC-721) NFT properties belong to logic of a concrete application that operates a Collection, so purposefully the NFT Tracking Module does not have any knowledge about properties except their byte size leaving application logic out to be controlled by Smart Contracts.1011The NFT Chain also provides:1213* Smart Contracts Pallet and example smart contract that interacts with NFT Runtime14* ERC-1155 Functionality (currently PoC as Re-Fungible tokens, i.e. items that are still unique, but that can be split between multiple users)15* Variety of economic options for dapp producers to choose from to create freemium games and other ways to attract users. As a step one, we implemented an economic model when a collection sponsor can be set to pay for collection Transfer transactions.1617Wider NFT Ecosystem (most of it was developed during Hackusama):18* [SubstraPunks Game hosted on IPFS](https://github.com/usetech-llc/substrapunks)19* [NFT Wallet and UI](https://uniqueapps.usetech.com/#/nft)20* [NFT Asset for Unity Framework](https://github.com/usetech-llc/nft_unity)2122Please see our [walk-thorugh instructions](doc/hackusama_walk_through.md) to try everything out!2324## Hackusama Update2526During the Kusama Hackaphon the following changes were made:27* Enabled Smart Contracts Pallet28* Enabled integration between Smart Contracts and NFT Pallet (required special edition of RC4 Substrate version)29* Fixed misc. bugs in NFT Pallet30* Deployed NFT TestNet. Public node available at wss://unique.usetech.com, custom UI types - see below in this README.31* New Features:32  * Re-Fungible Token Mode33  * Off-Chain Schema to store token image URLs34  * Alternative economic model35  * White Lists and Public Mint Permission36* Use example: [SubstraPunks Game](https://github.com/usetech-llc/substrapunks), fully hosted on IPFS and NFT Testnet Blockchain.3738## Application Development3940If you are building an application that operates NFT tokens, use [this document](doc/application_development.md).4142## Building4344Building NFT chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything so that we can keep the builds stable.45461. Install Rust:4748```bash49curl https://sh.rustup.rs -sSf | sh50sudo apt-get install libssl-dev pkg-config libclang-dev clang51```52532. Remove all installed toolchains with `rustup toolchain list` and `rustup toolchain uninstall <toolchain>`.54553. Install Rust Toolchain 1.44.0:5657```bash58rustup install 1.44.059```60614. Make it default (actual toochain version may be different, so do a `rustup toolchain list` first)62```bash63rustup toolchain list64rustup default 1.44.0-x86_64-unknown-linux-gnu65```66675. Install nightly toolchain and add wasm target for it:6869```bash70rustup toolchain install nightly-2020-05-0171rustup target add wasm32-unknown-unknown --toolchain nightly-2020-05-01-x86_64-unknown-linux-gnu72```73746. Build:75```bash76cargo build77```7879## Run8081You can start a development chain with:8283```bash84cargo run -- --dev85```8687Detailed logs may be shown by running the node with the following environment variables set: `RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`.8889If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with testnet units. Give each node a name and expose them so they are listed on the Polkadot [telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open.9091We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from the `--node-key` value that we specify below:9293```bash94cargo run -- \95  --base-path /tmp/alice \96  --chain=local \97  --alice \98  --node-key 0000000000000000000000000000000000000000000000000000000000000001 \99  --telemetry-url ws://telemetry.polkadot.io:1024 \100  --validator101```102103In the second terminal, we'll start Bob's substrate node on a different TCP port of 30334, and with his chain database stored locally at `/tmp/bob`. We'll specify a value for the `--bootnodes` option that will connect his node to Alice's bootnode ID on TCP port 30333:104105```bash106cargo run -- \107  --base-path /tmp/bob \108  --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \109  --chain=local \110  --bob \111  --port 30334 \112  --telemetry-url ws://telemetry.polkadot.io:1024 \113  --validator114```115116Additional CLI usage options are available and may be shown by running `cargo run -- --help`.117118119## UI custom types120```121{122  "Schedule": {123    "version": "u32",124    "put_code_per_byte_cost": "Gas",125    "grow_mem_cost": "Gas",126    "regular_op_cost": "Gas",127    "return_data_per_byte_cost": "Gas",128    "event_data_per_byte_cost": "Gas",129    "event_per_topic_cost": "Gas",130    "event_base_cost": "Gas",131    "call_base_cost": "Gas",132    "instantiate_base_cost": "Gas",133    "dispatch_base_cost": "Gas",134    "sandbox_data_read_cost": "Gas",135    "sandbox_data_write_cost": "Gas",136    "transfer_cost": "Gas",137    "instantiate_cost": "Gas",138    "max_event_topics": "u32",139    "max_stack_height": "u32",140    "max_memory_pages": "u32",141    "max_table_size": "u32",142    "enable_println": "bool",143    "max_subject_len": "u32"144  },145  "AccessMode": {146    "_enum": [147      "Normal",148      "WhiteList"149    ]150  },151  "CollectionMode": {152    "_enum": {153      "Invalid": null,154      "NFT": "u32",155      "Fungible": "u32",156      "ReFungible": "(u32, u32)"157    }158  },159  "Ownership": {160    "Owner": "AccountId",161    "Fraction": "u128"162  },163  "FungibleItemType": {164    "Collection": "u64",165    "Owner": "AccountId",166    "Value": "u128"167  },168  "ReFungibleItemType": {169    "Collection": "u64",170    "Owner": "Vec<Ownership>",171    "Data": "Vec<u8>"172  },173  "NftItemType": {174    "Collection": "u64",175    "Owner": "AccountId",176    "Data": "Vec<u8>"177  },178  "Ownership": {179    "owner": "AccountId",180    "fraction": "u128"181  },182  "ReFungibleItemType": {183    "Collection": "u64",184    "Owner": "Vec<Ownership<AccountId>>",185    "Data": "Vec<u8>"186  },187  "CollectionType": {188    "Owner": "AccountId",189    "Mode": "CollectionMode",190    "Access": "AccessMode",191    "DecimalPoints": "u32",192    "Name": "Vec<u16>",193    "Description": "Vec<u16>",194    "TokenPrefix": "Vec<u8>",195    "CustomDataSize": "u32",196    "MintMode": "bool",197    "OffchainSchema": "Vec<u8>",198    "Sponsor": "AccountId",199    "UnconfirmedSponsor": "AccountId"200  },201  "ApprovePermissions": {202    "Approved": "AccountId",203    "Amount": "u64"204  },205  "RawData": "Vec<u8>",206  "Address": "AccountId",207  "LookupSource": "AccountId",208  "Weight": "u64"209}210211```
after · README.md
1![Docker build](https://github.com/usetech-llc/nft_parachain/workflows/Docker%20build/badge.svg)23# NFT Parachain45## Project Description67The NFT Pallet is the core of NFT functionality. Like ERC-721 standard in Ethereum ecosystem, this pallet provides the basement for creating collections of unique non-divisible things, also called Non Fungible Tokens (NFTs), minting NFT of a given Collection, and managing their ownership.89The pallet also enables storing NFT properties. Though (according to ERC-721) NFT properties belong to logic of a concrete application that operates a Collection, so purposefully the NFT Tracking Module does not have any knowledge about properties except their byte size leaving application logic out to be controlled by Smart Contracts.1011The NFT Chain also provides:1213* Smart Contracts Pallet and example smart contract that interacts with NFT Runtime14* ERC-1155 Functionality (currently PoC as Re-Fungible tokens, i.e. items that are still unique, but that can be split between multiple users)15* Variety of economic options for dapp producers to choose from to create freemium games and other ways to attract users. As a step one, we implemented an economic model when a collection sponsor can be set to pay for collection Transfer transactions.1617Wider NFT Ecosystem (most of it was developed during Hackusama):18* [SubstraPunks Game hosted on IPFS](https://github.com/usetech-llc/substrapunks)19* [NFT Wallet and UI](https://uniqueapps.usetech.com/#/nft)20* [NFT Asset for Unity Framework](https://github.com/usetech-llc/nft_unity)2122Please see our [walk-thorugh instructions](doc/hackusama_walk_through.md) to try everything out!2324## Hackusama Update2526During the Kusama Hackaphon the following changes were made:27* Enabled Smart Contracts Pallet28* Enabled integration between Smart Contracts and NFT Pallet (required special edition of RC4 Substrate version)29* Fixed misc. bugs in NFT Pallet30* Deployed NFT TestNet. Public node available at wss://unique.usetech.com, custom UI types - see below in this README.31* New Features:32  * Re-Fungible Token Mode33  * Off-Chain Schema to store token image URLs34  * Alternative economic model35  * White Lists and Public Mint Permission36* Use example: [SubstraPunks Game](https://github.com/usetech-llc/substrapunks), fully hosted on IPFS and NFT Testnet Blockchain.3738## Application Development3940If you are building an application that operates NFT tokens, use [this document](doc/application_development.md).4142## Building4344Building NFT chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything so that we can keep the builds stable.45461. Install Rust:4748```bash49curl https://sh.rustup.rs -sSf | sh50sudo apt-get install libssl-dev pkg-config libclang-dev clang51```52532. Remove all installed toolchains with `rustup toolchain list` and `rustup toolchain uninstall <toolchain>`.54553. Install Rust Toolchain 1.44.0:5657```bash58rustup install 1.44.059```60614. Make it default (actual toochain version may be different, so do a `rustup toolchain list` first)62```bash63rustup toolchain list64rustup default 1.44.0-x86_64-unknown-linux-gnu65```66675. Install nightly toolchain and add wasm target for it:6869```bash70rustup toolchain install nightly-2020-05-0171rustup target add wasm32-unknown-unknown --toolchain nightly-2020-05-01-x86_64-unknown-linux-gnu72```73746. Build:75```bash76cargo build77```7879## Run8081You can start a development chain with:8283```bash84cargo run -- --dev85```8687Detailed logs may be shown by running the node with the following environment variables set: `RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`.8889If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with testnet units. Give each node a name and expose them so they are listed on the Polkadot [telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open.9091We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from the `--node-key` value that we specify below:9293```bash94cargo run -- \95  --base-path /tmp/alice \96  --chain=local \97  --alice \98  --node-key 0000000000000000000000000000000000000000000000000000000000000001 \99  --telemetry-url ws://telemetry.polkadot.io:1024 \100  --validator101```102103In the second terminal, we'll start Bob's substrate node on a different TCP port of 30334, and with his chain database stored locally at `/tmp/bob`. We'll specify a value for the `--bootnodes` option that will connect his node to Alice's bootnode ID on TCP port 30333:104105```bash106cargo run -- \107  --base-path /tmp/bob \108  --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \109  --chain=local \110  --bob \111  --port 30334 \112  --telemetry-url ws://telemetry.polkadot.io:1024 \113  --validator114```115116Additional CLI usage options are available and may be shown by running `cargo run -- --help`.117118## Benchmarks119120First of all, add rust toolchain and make it default.121rustup target add wasm32-unknown-unknown --toolchain nightly-2020-10-01122123Then in "/node/src" run build command below124cargo +nightly-2020-10-01 build --release --features runtime-benchmarks125126Run benchmark127target/release/nft benchmark --chain dev --pallet "pallet_nft" --extrinsic "*" --repeat 1128129## UI custom types130```131{132  "Schedule": {133    "version": "u32",134    "put_code_per_byte_cost": "Gas",135    "grow_mem_cost": "Gas",136    "regular_op_cost": "Gas",137    "return_data_per_byte_cost": "Gas",138    "event_data_per_byte_cost": "Gas",139    "event_per_topic_cost": "Gas",140    "event_base_cost": "Gas",141    "call_base_cost": "Gas",142    "instantiate_base_cost": "Gas",143    "dispatch_base_cost": "Gas",144    "sandbox_data_read_cost": "Gas",145    "sandbox_data_write_cost": "Gas",146    "transfer_cost": "Gas",147    "instantiate_cost": "Gas",148    "max_event_topics": "u32",149    "max_stack_height": "u32",150    "max_memory_pages": "u32",151    "max_table_size": "u32",152    "enable_println": "bool",153    "max_subject_len": "u32"154  },155  "AccessMode": {156    "_enum": [157      "Normal",158      "WhiteList"159    ]160  },161  "CollectionMode": {162    "_enum": {163      "Invalid": null,164      "NFT": "u32",165      "Fungible": "u32",166      "ReFungible": "(u32, u32)"167    }168  },169  "Ownership": {170    "Owner": "AccountId",171    "Fraction": "u128"172  },173  "FungibleItemType": {174    "Collection": "u64",175    "Owner": "AccountId",176    "Value": "u128"177  },178  "ReFungibleItemType": {179    "Collection": "u64",180    "Owner": "Vec<Ownership>",181    "Data": "Vec<u8>"182  },183  "NftItemType": {184    "Collection": "u64",185    "Owner": "AccountId",186    "Data": "Vec<u8>"187  },188  "Ownership": {189    "owner": "AccountId",190    "fraction": "u128"191  },192  "ReFungibleItemType": {193    "Collection": "u64",194    "Owner": "Vec<Ownership<AccountId>>",195    "Data": "Vec<u8>"196  },197  "CollectionType": {198    "Owner": "AccountId",199    "Mode": "CollectionMode",200    "Access": "AccessMode",201    "DecimalPoints": "u32",202    "Name": "Vec<u16>",203    "Description": "Vec<u16>",204    "TokenPrefix": "Vec<u8>",205    "CustomDataSize": "u32",206    "MintMode": "bool",207    "OffchainSchema": "Vec<u8>",208    "Sponsor": "AccountId",209    "UnconfirmedSponsor": "AccountId"210  },211  "ApprovePermissions": {212    "Approved": "AccountId",213    "Amount": "u64"214  },215  "RawData": "Vec<u8>",216  "Address": "AccountId",217  "LookupSource": "AccountId",218  "Weight": "u64"219}220221```
modifiedpallets/nft/Cargo.tomldiffbeforeafterboth
--- a/pallets/nft/Cargo.toml
+++ b/pallets/nft/Cargo.toml
@@ -42,7 +42,7 @@
 branch = 'v2.0.0_release'
 version = '2.0.0'
 
-[dev-dependencies.sp-runtime]
+[dependencies.sp-runtime]
 default-features = false
 git = 'https://github.com/usetech-llc/substrate.git'
 branch = 'v2.0.0_release'
@@ -66,6 +66,13 @@
 branch = 'v2.0.0_release'
 version = '2.0.0'
 
+[dependencies.frame-benchmarking]
+version = "2.0.0"
+default-features = false
+git = 'https://github.com/usetech-llc/substrate.git'
+branch = 'v2.0.0_release'
+optional = true
+
 [features]
 default = ['std']
 std = [
@@ -74,4 +81,7 @@
     'frame-support/std',
     'frame-system/std',
     'sp-std/std',
+    'sp-runtime/std',
+    'frame-benchmarking/std',
 ]
+runtime-benchmarks = ["frame-benchmarking"]
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -185,6 +185,49 @@
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 }
 
+
+#[cfg(feature = "runtime-benchmarks")]
+mod benchmarking {
+    use super::*;
+    use sp_std::prelude::*;
+    use frame_system::RawOrigin;
+    // use frame_support::{ensure, traits::OnFinalize};
+    use frame_benchmarking::{benchmarks, account};  // , TrackedStorageKey, whitelisted_caller
+    use crate::Module as Nft;
+
+    const SEED: u32 = 1;
+
+    benchmarks! {
+
+        _ {}
+
+        create_collection {
+            let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+            let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+            let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+            let mode: CollectionMode = CollectionMode::NFT(2000);
+            let caller: T::AccountId = account("caller", 0, SEED);
+        }: create_collection(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)
+        verify {
+			assert_eq!(Nft::<T>::collection(2).owner, caller);
+		}
+    }
+
+    #[cfg(test)]
+    mod tests {
+        use super::*;
+        use crate::tests_composite::{ExtBuilder, Test};
+        use frame_support::assert_ok;
+
+        #[test]
+        fn create_collection() {
+            ExtBuilder::default().build().execute_with(|| {
+                assert_ok!(test_benchmark_create_collection::<Test>());
+            });
+        }
+    }
+}
+
 // #endregion
 
 decl_storage! {
@@ -1936,3 +1979,5 @@
     }
 }
 // #endregion
+
+
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
--- a/pallets/nft/src/tests.rs
+++ b/pallets/nft/src/tests.rs
@@ -177,7 +177,7 @@
         assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);
         assert_eq!(TemplateModule::balance_count(1, 1), 0);
         assert_eq!(TemplateModule::balance_count(1, 2), 1000);
-        assert_eq!(TemplateModule::address_tokens(1, 1), []);
+        // assert_eq!(TemplateModule::address_tokens(1, 1), []);
         assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
 
         // split item scenario
@@ -260,7 +260,7 @@
         );
         assert_eq!(TemplateModule::balance_count(1, 1), 0);
         assert_eq!(TemplateModule::balance_count(1, 2), 1000);
-        assert_eq!(TemplateModule::address_tokens(1, 1), []);
+        // assert_eq!(TemplateModule::address_tokens(1, 1), []);
         assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
 
         // split item scenario
@@ -350,7 +350,7 @@
         assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);
         assert_eq!(TemplateModule::balance_count(1, 1), 0);
         assert_eq!(TemplateModule::balance_count(1, 2), 1);
-        assert_eq!(TemplateModule::address_tokens(1, 1), []);
+        // assert_eq!(TemplateModule::address_tokens(1, 1), []);
         assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
     });
 }
@@ -632,7 +632,7 @@
         ));
         assert_eq!(TemplateModule::balance_count(1, 1), 0);
         assert_eq!(TemplateModule::balance_count(1, 3), 1000);
-        assert_eq!(TemplateModule::address_tokens(1, 1), []);
+        // assert_eq!(TemplateModule::address_tokens(1, 1), []);
         assert_eq!(TemplateModule::address_tokens(1, 3), [2]);
 
         assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);
@@ -2162,7 +2162,7 @@
 
         assert_noop!(
             TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),
-            "Collection is not in mint mode"
+            "Public minting is not allowed for this collection"
         );
     });
 }
@@ -2209,7 +2209,7 @@
 
         assert_noop!(
             TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),
-            "Collection is not in mint mode"
+            "Public minting is not allowed for this collection"
         );
     });
 }
modifiedruntime/Cargo.tomldiffbeforeafterboth
--- a/runtime/Cargo.toml
+++ b/runtime/Cargo.toml
@@ -67,6 +67,7 @@
     'frame-system/runtime-benchmarks',
     'pallet-balances/runtime-benchmarks',
     'pallet-timestamp/runtime-benchmarks',
+    'pallet-nft/runtime-benchmarks',
     'sp-runtime/runtime-benchmarks',
 ]
 std = [
modifiedruntime/src/lib.rsdiffbeforeafterboth
--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -84,6 +84,7 @@
 /// Digest item type.
 pub type DigestItem = generic::DigestItem<Hash>;
 
+
 /// Opaque types. These are used by the CLI to instantiate machinery that don't need to know
 /// the specifics of the runtime. They can then be made to be agnostic over specific formats
 /// of data like extrinsics, allowing for them to continue syncing the network through upgrades
@@ -526,10 +527,10 @@
 		) -> Result<Vec<frame_benchmarking::BenchmarkBatch>, sp_runtime::RuntimeString> {
 			use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey};
 
-			use frame_system_benchmarking::Module as SystemBench;
-			impl frame_system_benchmarking::Trait for Runtime {}
+			// use frame_system_benchmarking::Module as SystemBench;
+			// impl frame_system_benchmarking::Trait for Runtime {}
 
-			let mut whitelist: Vec<TrackedStorageKey> = vec![
+			let whitelist: Vec<TrackedStorageKey> = vec![
 				// Block Number
 				hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(),
 				// Total Issuance
@@ -545,9 +546,10 @@
 			let mut batches = Vec::<BenchmarkBatch>::new();
 			let params = (&config, &whitelist);
 
-			add_benchmark!(params, batches, frame_system, SystemBench::<Runtime>);
-			add_benchmark!(params, batches, pallet_balances, Balances);
-			add_benchmark!(params, batches, pallet_timestamp, Timestamp);
+			// add_benchmark!(params, batches, frame_system, SystemBench::<Runtime>);
+			// add_benchmark!(params, batches, pallet_balances, Balances);
+			// add_benchmark!(params, batches, pallet_timestamp, Timestamp);
+			add_benchmark!(params, batches, pallet_nft, Nft);
 
 			if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) }
 			Ok(batches)