Skip to content

俊佳-第三次作业 #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed PPT/第零课.pdf
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 36 additions & 1 deletion projects/lesson-3/runtime/src/kitties.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,42 @@ decl_module! {
let dna = payload.using_encoded(blake2_128);
let kitty = Kitty(dna);
Kitties::insert(count, kitty);
KittiesCount::put(count + 1);
// KittiesCount::put(count + 1);
let new_kitties_count = Self::kitties_count().checked_add(1)
.ok_or("Kitties count overflow")?;
KittiesCount::put(new_kitties_count);
}
/// Breed kitties
pub fn breed(origin, kitty_id_one: u32, kitty_id_two: u32) {
let sender = ensure_signed(origin)?;

let kitty1 = Self::kitty(kitty_id_one);
let kitty2 = Self::kitty(kitty_id_two);
// ensure!(kitty1.is_some(), "非法的id");
// ensure!(kitty2.is_some(), "非法的id");
ensure!(kitty_id_one != kitty_id_two, "需要一个父代和一个母代");
let kitty_id = Self::kitties_count();
let kitty1_dna = kitty1.0;
let kitty2_dna = kitty2.0;
//
let random = (<system::Module<T>>::random_seed(), &sender,
<system::Module<T>>::extrinsic_index());
let hashed = random.using_encoded(blake2_128);
let mut new_dna = [0u8; 16];
for i in 0..kitty1_dna.len() {
if i%3 == 0 {
new_dna[i] = kitty1_dna[i];
} else if i%3 == 1{
new_dna[i] = kitty2_dna[i];
} else {
new_dna[i] = hashed[i];
}
}
Kitties::insert(kitty_id, Kitty(new_dna));
// KittiesCount::put(count + 1);
let new_kitties_count = Self::kitties_count().checked_add(1)
.ok_or("Kitties count overflow")?;
KittiesCount::put(new_kitties_count);
}
}
}
46 changes: 32 additions & 14 deletions projects/lesson-4/runtime/src/kitties.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,24 +34,27 @@ decl_module! {

// 作业:重构create方法,避免重复代码

let kitty_id = Self::kitties_count();
if kitty_id == T::KittyIndex::max_value() {
return Err("Kitties count overflow");
}
// let kitty_id = Self::kitties_count();
// if kitty_id == T::KittyIndex::max_value() {
// return Err("Kitties count overflow");
// }
let kitty_id = Self::next_kitty_id()?;

// Generate a random 128bit value
let payload = (<system::Module<T>>::random_seed(), &sender, <system::Module<T>>::extrinsic_index(), <system::Module<T>>::block_number());
let dna = payload.using_encoded(blake2_128);
// let payload = (<system::Module<T>>::random_seed(), &sender, <system::Module<T>>::extrinsic_index(), <system::Module<T>>::block_number());
// let dna = payload.using_encoded(blake2_128);
let dna = Self::random_value(&sender);

// Create and store kitty
let kitty = Kitty(dna);
<Kitties<T>>::insert(kitty_id, kitty);
<KittiesCount<T>>::put(kitty_id + 1.into());

// Store the ownership information
let user_kitties_id = Self::owned_kitties_count(&sender);
<OwnedKitties<T>>::insert((sender.clone(), user_kitties_id), kitty_id);
<OwnedKittiesCount<T>>::insert(sender, user_kitties_id + 1.into());
// <Kitties<T>>::insert(kitty_id, kitty);
// <KittiesCount<T>>::put(kitty_id + 1.into());

// // Store the ownership information
// let user_kitties_id = Self::owned_kitties_count(&sender);
// <OwnedKitties<T>>::insert((sender.clone(), user_kitties_id), kitty_id);
// <OwnedKittiesCount<T>>::insert(sender, user_kitties_id + 1.into());
Self::insert_kitty(sender, kitty_id, kitty);
}

/// Breed kitties
Expand All @@ -60,6 +63,20 @@ decl_module! {

Self::do_breed(sender, kitty_id_1, kitty_id_2)?;
}
/// Transfer a kitty to other owner
pub fn transfer(origin, to_account: T::AccountId, kitty_id: T::KittyIndex) {
let sender = ensure_signed(origin)?;

ensure!(<OwnedKitties<T>>::exists(&(sender.clone(),kitty_id)), "Only owner can transfer kitty");

let to_account_kitties_id = Self::owned_kitties_count(to_account.clone());
<OwnedKitties<T>>::insert((to_account.clone(), to_account_kitties_id), kitty_id);
<OwnedKittiesCount<T>>::insert(to_account.clone(),to_account_kitties_id + 1.into());

let sender_kitties_id = Self::owned_kitties_count(sender.clone());
// <OwnedKitties<T>>::kill((sender.clone(), sender_kitties_id),kitty_id);
<OwnedKittiesCount<T>>::insert(sender.clone(),sender_kitties_id - 1.into());
}
}
}

Expand All @@ -69,7 +86,8 @@ fn combine_dna(dna1: u8, dna2: u8, selector: u8) -> u8 {
// selector.map_bits(|bit, index| if (bit == 1) { dna1 & (1 << index) } else { dna2 & (1 << index) })
// 注意 map_bits这个方法不存在。只要能达到同样效果,不局限算法
// 测试数据:dna1 = 0b11110000, dna2 = 0b11001100, selector = 0b10101010, 返回值 0b11100100
return dna1;
// return dna1;
return ((dna1 & selector) | (dna2 & !selector));
}

impl<T: Trait> Module<T> {
Expand Down
23 changes: 22 additions & 1 deletion projects/lesson-5/runtime/src/kitties.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use support::{decl_module, decl_storage, ensure, StorageValue, StorageMap, dispatch::Result, Parameter};
use support::{decl_module, decl_storage, ensure, StorageValue, StorageMap, dispatch::Result, Parameter,traits::Currency};
use sr_primitives::traits::{SimpleArithmetic, Bounded, Member};
use codec::{Encode, Decode};
use runtime_io::blake2_128;
Expand All @@ -7,6 +7,7 @@ use rstd::result;

pub trait Trait: system::Trait {
type KittyIndex: Parameter + Member + SimpleArithmetic + Bounded + Default + Copy;
type Currency: Currency<Self::AccountId>;
}

#[derive(Encode, Decode)]
Expand All @@ -27,6 +28,8 @@ decl_storage! {
pub KittiesCount get(kitties_count): T::KittyIndex;

pub OwnedKitties get(owned_kitties): map (T::AccountId, Option<T::KittyIndex>) => Option<KittyLinkedItem<T>>;

pub KittyPrices get(kitty_price): map T::KittyIndex => Option<u64>;
}
}

Expand Down Expand Up @@ -55,6 +58,23 @@ decl_module! {
// 作业:实现 transfer(origin, to: T::AccountId, kitty_id: T::KittyIndex)
// 使用 ensure! 来保证只有主人才有权限调用 transfer
// 使用 OwnedKitties::append 和 OwnedKitties::remove 来修改小猫的主人
///Transfer a kitty to other owner
pub fn transfer(origin, to: T::AccountId, kitty_id: T::KittyIndex) {
let sender = ensure_signed(origin)?;

ensure!(<OwnedKitties<T>>::exists(&(sender.clone(), Some(kitty_id))), "Only kitty can be transfered by owner");

<OwnedKitties<T>>::remove(&sender, kitty_id);
<OwnedKitties<T>>::append(&to, kitty_id);
}
//
pub fn sell(origin, kitty_id: T::KittyIndex, price: u64) {
let sender = ensure_signed(origin)?;

ensure!(<OwnedKitties<T>>::exists(&(sender.clone(), Some(kitty_id))), "Only kitty can be set price by owner");

<KittyPrices<T>>::insert(kitty_id, price);
}
}
}

Expand Down Expand Up @@ -142,6 +162,7 @@ impl<T: Trait> Module<T> {

fn insert_owned_kitty(owner: &T::AccountId, kitty_id: T::KittyIndex) {
// 作业:调用 OwnedKitties::append 完成实现
<OwnedKitties<T>>::append(owner, kitty_id);
}

fn insert_kitty(owner: &T::AccountId, kitty_id: T::KittyIndex, kitty: Kitty) {
Expand Down
1 change: 1 addition & 0 deletions projects/lesson-5/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ impl template::Trait for Runtime {

impl kitties::Trait for Runtime {
type KittyIndex = u32;
type Currency: Currency<Self::AccountId>;
}

construct_runtime!(
Expand Down
77 changes: 53 additions & 24 deletions projects/lesson-6/runtime/src/kitties.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ mod tests {
use sr_primitives::{traits::{BlakeTwo256, IdentityLookup}, testing::Header};
use sr_primitives::weights::Weight;
use sr_primitives::Perbill;
use crate::{ExistentialDeposit,TransferFee,CreationFee,TransactionBaseFee,TransactionByteFee};

impl_outer_origin! {
pub enum Origin for Test {}
Expand Down Expand Up @@ -247,8 +248,26 @@ mod tests {
type AvailableBlockRatio = AvailableBlockRatio;
type Version = ();
}
impl balances::Trait for Test {
type Balance = u128;
type OnFreeBalanceZero = ();
type OnNewAccount = ();
type Event = ();

type TransactionPayment = ();
type DustRemoval = ();
type TransferPayment = ();
type ExistentialDeposit = ExistentialDeposit;
type TransferFee = TransferFee;
type CreationFee = CreationFee;
type TransactionBaseFee = TransactionBaseFee;
type TransactionByteFee = TransactionByteFee;
type WeightToFee = ();
}
impl Trait for Test {
type KittyIndex = u32;
type Currency = balances::Module<Test>;
type Event = ();
}
type OwnedKittiesTest = OwnedKitties<Test>;

Expand All @@ -261,53 +280,56 @@ mod tests {
#[test]
fn owned_kitties_can_append_values() {
with_externalities(&mut new_test_ext(), || {
OwnedKittiesTest::append(&0, 1);
// OwnedKittiesTest::append(&0, 1);
OwnedKittiesList::<Test>::append(&0, 1);

assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem::<Test> {
prev: Some(1),
next: Some(1),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem::<Test> {
prev: None,
next: None,
}));

OwnedKittiesTest::append(&0, 2);
// OwnedKittiesTest::append(&0, 2);
OwnedKittiesList::<Test>::append(&0, 2);

assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem::<Test> {
prev: Some(2),
next: Some(1),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem::<Test> {
prev: None,
next: Some(2),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), Some(KittyLinkedItem::<Test> {
prev: Some(1),
next: None,
}));

OwnedKittiesTest::append(&0, 3);
// OwnedKittiesTest::append(&0, 3);
OwnedKittiesList::<Test>::append(&0, 3);

assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem::<Test> {
prev: Some(3),
next: Some(1),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem::<Test> {
prev: None,
next: Some(2),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), Some(KittyLinkedItem::<Test> {
prev: Some(1),
next: Some(3),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem::<Test> {
prev: Some(2),
next: None,
}));
Expand All @@ -317,32 +339,38 @@ mod tests {
#[test]
fn owned_kitties_can_remove_values() {
with_externalities(&mut new_test_ext(), || {
OwnedKittiesTest::append(&0, 1);
OwnedKittiesTest::append(&0, 2);
OwnedKittiesTest::append(&0, 3);
// OwnedKittiesTest::append(&0, 1);
// OwnedKittiesTest::append(&0, 2);
// OwnedKittiesTest::append(&0, 3);

// OwnedKittiesTest::remove(&0, 2);
OwnedKittiesList::<Test>::append(&0, 1);
OwnedKittiesList::<Test>::append(&0, 2);
OwnedKittiesList::<Test>::append(&0, 3);

OwnedKittiesTest::remove(&0, 2);
OwnedKittiesList::<Test>::remove(&0, 2);

assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem::<Test> {
prev: Some(3),
next: Some(1),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(1))), Some(KittyLinkedItem::<Test> {
prev: None,
next: Some(3),
}));

assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), None);

assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem::<Test> {
prev: Some(1),
next: None,
}));

OwnedKittiesTest::remove(&0, 1);
// OwnedKittiesTest::remove(&0, 1);
OwnedKittiesList::<Test>::remove(&0, 1);

assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem::<Test> {
prev: Some(3),
next: Some(3),
}));
Expand All @@ -351,14 +379,15 @@ mod tests {

assert_eq!(OwnedKittiesTest::get(&(0, Some(2))), None);

assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, Some(3))), Some(KittyLinkedItem::<Test> {
prev: None,
next: None,
}));

OwnedKittiesTest::remove(&0, 3);
// OwnedKittiesTest::remove(&0, 3);
OwnedKittiesList::<Test>::remove(&0, 3);

assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem {
assert_eq!(OwnedKittiesTest::get(&(0, None)), Some(KittyLinkedItem::<Test> {
prev: None,
next: None,
}));
Expand Down
38 changes: 37 additions & 1 deletion projects/lesson-6/runtime/src/linked_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,45 @@ impl<Storage, Key, Value> LinkedList<Storage, Key, Value> where

pub fn append(key: &Key, value: Value) {
// 作业:实现 append
let head = Self::read_head(key);
let new_head = LinkedItem {
prev: Some(value),
next: head.next,
};

Self::write_head(key, new_head);
let prev = Self::read(key, head.prev);
let new_prev = LinkedItem {
prev: prev.prev,
next: Some(value),
};
Self::write(key, head.prev, new_prev);

let item = LinkedItem {
prev: head.prev,
next: None,
};
Self::write(key, Some(value), item);
}

pub fn remove(key: &Key, value: Value) {
// 作业:实现 remove
if let Some(item) = Storage::take(&(key.clone(), Some(value))) {
let prev = Self::read(key, item.prev);
let new_prev = LinkedItem {
prev: prev.prev,
next: item.next,
};

Self::write(key, item.prev, new_prev);

let next = Self::read(key, item.next);
let new_next = LinkedItem {
prev: item.prev,
next: next.next,
};

Self::write(key, item.next, new_next);
}
}
}
}
Loading