Refreshing rust knowledge

master
six 2022-02-21 17:05:38 +01:00
parent 1d01d94882
commit 68ed942727
22 changed files with 1518 additions and 8 deletions

View File

@ -1,8 +0,0 @@
# Building for example a lib such as "rust-syslog" - This needs exec privilege on the target partition.
cargo build
# Add external !built! crate
rustc -L /home/extern/path asd.rs
rustc asd.rs --extern /home/path/lib

4
README.me 100644
View File

@ -0,0 +1,4 @@
Similar as Python notes, these are practical examples that help reminding logic, optimization, syntax and security related topics.
General code folder: consist of basic code examples of standard rust.
Smart contract code folder: consist of Rust based smart contract code.

View File

@ -0,0 +1,18 @@
# Building for example a lib such as "rust-syslog" - This needs exec privilege on the source partition.
cargo build
# Add external !built! crate
rustc -L /home/extern/path asd.rs
rustc asd.rs --extern /home/path/lib
# Install cargo audit
cargo install cargo-audit
# Clippy warnings check
rustup update
rustup component add clippy
cargo clippy
# cargo clippy --fix

View File

@ -0,0 +1,27 @@
fn main() {
fn answer_to_life_the_universe_and_everything() -> i32 {
return 42;
}
#[warn(overflowing_literals)]
fn another_function(x: i32) {
println!("The value of x is: {}", x);
}
answer_to_life_the_universe_and_everything();
another_function(6);
//// On x86 (32-bit, 4-byte):
// - 0x00000000 -> 0
// - 0xffffffff -> -1
// - 0x7fffffff -> 2147483647 (INT_MAX)
// - 0x80000000 -> -2147483648 (INT_MIN)
// 0x00000001 + 0x00000002 = 0x00000003 ( 1 + 2 = 3)
// 0xffffffff + 0x00000002 = 0x00000001 (-1 + 2 = 1)
// 0xffffffff + 0xfffffffe = 0xfffffffd (-1 +-2 =-3)
//another_function(2147483648);
}

View File

@ -0,0 +1,40 @@
// clap = "3.0.0-beta.5"
extern crate clap;
use clap::{Arg, App};
fn main() {
let app = App::new("hello-clap");
let iternum = Arg::with_name("n")
.long("num")
.takes_value(true)
.help("You need to specify the max number of iterations.")
.required(true);
let funcatk = Arg::with_name("f")
.long("func")
.takes_value(true)
.help("You need to specify the function to attack.")
.required(true);
let contractf = Arg::with_name("c")
.long("contract")
.takes_value(true)
.help("You need to specify the contract file's name.")
.required(true);
let app = app.arg(iternum);
let app = app.arg(funcatk);
let app = app.arg(contractf);
let matches = app.get_matches();
let iternumout = matches.value_of("iternum")
.expect("Required option.");
let funcatkout = matches.value_of("funcatk")
.expect("Required option.");
let contractfout = matches.value_of("contractf")
.expect("Required option.");
println!("Your options are: {} {} {}!", iternumout, funcatkout, contractfout);
}

View File

@ -0,0 +1,8 @@
[package]
name = "Rust_Examples_and_Notes"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

Binary file not shown.

View File

@ -0,0 +1,99 @@
fn main() {
//// 000_println.rs
println!("Printed text.");
print!("No new line.");
//// 010_add_distract_math_literal_operator.rs
//https://doc.rust-lang.org/rust-by-example/primitives/literals.html
println!("1 + 2 = {}", 1u32 + 2);
println!("1 + 2 = {}", 32 + 2);
println!("1 - 2 = {}", 1i32 - 2);
//println!("1 - 2 = {}", 1u32 - 2); // panic because of overflow, program halts !!
// Short-circuiting boolean logic
println!("true AND false is {}", true && false);
println!("true OR false is {}", true || false);
println!("NOT true is {}", !true);
// Bitwise operations
println!("0011 AND 0101 is {:04b}", 0b0011u32 & 0b0101);
println!("0011 OR 0101 is {:04b}", 0b0011u32 | 0b0101);
println!("0011 XOR 0101 is {:04b}", 0b0011u32 ^ 0b0101);
println!("1 << 5 is {}", 1u32 << 5);
println!("0x80 >> 2 is 0x{:x}", 0x80u32 >> 2);
// Use underscores to improve readability!
println!("One million is written as {}", 1_000_000u32);
reverse((1,true));
tuplez();
}
//// 020_tuples.rs
// https://doc.rust-lang.org/rust-by-example/primitives/tuples.html
// Tuples can be used as function arguments and as return values
fn reverse(pair: (i32, bool)) -> (bool, i32) {
// `let` can be used to bind the members of a tuple to variables
let (integer, boolean) = pair;
(boolean, integer)
}
// The following struct is for the activity.
#[derive(Debug)]
struct Matrix(f32, f32, f32, f32);
fn tuplez() {
// ---------- //
// A tuple with a bunch of different types
let long_tuple = (1u8, 2u16, 3u32, 4u64,
-1i8, -2i16, -3i32, -4i64,
0.1f32, 0.2f64,
'a', true);
// Values can be extracted from the tuple using tuple indexing
println!("long tuple first value: {}", long_tuple.0);
println!("long tuple second value: {}", long_tuple.1);
// ---------- //
// Tuples can be tuple members
let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16);
// Tuples are printable
println!("tuple of tuples: {:?}", tuple_of_tuples); // !! {:?} is useful also for debugging
// But long Tuples cannot be printed !!
// let too_long_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
// println!("too long tuple: {:?}", too_long_tuple);
// TODO ^ Uncomment the above 2 lines to see the compiler error
let pair = (1, true);
println!("pair is {:?}", pair);
println!("the reversed pair is {:?}", reverse(pair));
// To create one element tuples, the comma is required to tell them apart
// from a literal surrounded by parentheses
println!("one element tuple: {:?}", (5u32,));
println!("just an integer: {:?}", (5u32));
//tuples can be destructured to create bindings
let tuple = (1, "hello", 4.5, true);
let (a, b, c, d) = tuple;
println!("{:?}, {:?}, {:?}, {:?}", a, b, c, d);
let matrix = Matrix(1.1, 1.2, 2.1, 2.2);
println!("{:?}", matrix);
}

1272
smart_contract_code/Cargo.lock generated 100644

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,40 @@
[package]
name = "flipper"
version = "0.1.0"
authors = ["Test user and mail"]
edition = "2018"
resolver = "2"
[dependencies]
ink_primitives = { version = "3.0.0-rc7", default-features = false }
ink_metadata = { version = "3.0.0-rc7", default-features = false, features = ["derive"], optional = true }
ink_env = { version = "3.0.0-rc7", default-features = false }
ink_storage = { version = "3.0.0-rc7", default-features = false }
ink_lang = { version = "3.0.0-rc7", default-features = false }
scale = { package = "parity-scale-codec", version = "2.1", default-features = false, features = ["derive"] }
scale-info = { version = "1.0.0", default-features = false, features = ["derive"], optional = true }
[lib]
name = "flipper"
path = "lib.rs"
crate-type = [
# Used for normal contract Wasm blobs.
"cdylib",
]
# Needed until https://github.com/paritytech/ink/issues/364 is resolved.
[profile.release]
overflow-checks = false
[features]
default = ["std"]
std = [
"ink_metadata/std",
"ink_env/std",
"ink_storage/std",
"ink_primitives/std",
"scale/std",
"scale-info/std",
]
ink-as-dependency = []

View File

@ -0,0 +1,10 @@
# https://docs.substrate.io/tutorials/v3/ink-workshop/pt1/#running-a-substrate-smart-contracts-node
# https://github.com/paritytech/ink/blob/v3.0.0-rc5/examples/flipper/lib.rs
> cargo install cargo-contract --vers ^0.16 --force --locked
> cargo contract new flipper
> cd Rust_Examples_and_Notes/smart_contract_code
> cargo +nightly test
> cargo +nightly contract build

View File