LapTrinhBlockchain

Chia sẻ kiến thức về Lập Trình Blockchain

Kiến thức Blockchain, Lập trình Blockchain, Lập Trình DApp, Lập trình Smart Contract, Nâng cao Kiến thức

Hành trình kiếm NEAR trên nearvember: 12 ngày, 12 thử thách, 15 giải thưởng lớn

Hành trình kiếm NEAR trên nearvember: 12 ngày, 12 thử thách, 15 giải thưởng lớn

Hành trình kiếm NEAR trên nearvember: 12 ngày, 12 thử thách, 15 giải thưởng lớn

Chia sẻ bài viết
5
(8)

Hiện tại NEAR đang tổ chức chương trình tìm hiểu công nghệ đột phá Blockchain và kiếm tiền điện tử tại địa chỉ: https://nearvember.near.org. Chương trình bắt đầu từ ngày 2021-11-18, mình biết hơi muộn nên cuối ngày mới tham gia. Nhưng còn 11 ngày nữa để phấn đấu thử sức mình. Bài viết này mình cập nhật hành trình tham gia của mình coi như là 1 trải nghiệm của bản thân.

Nói chung bạn không cần quá quan tâm vào điểm số, mà bạn chỉ cần hoàn thành được tất cả thử thách này, level của bạn được nâng cao nên khá nhiều. Đây cũng là một cách học hết sức thú vị.

Hành trình kiếm NEAR trên nearvember: 12 ngày, 12 thử thách, 15 giải thưởng lớn
Hành trình kiếm NEAR trên nearvember: 12 ngày, 12 thử thách, 15 giải thưởng lớn

Nếu bạn có tham gia, bạn có thể xem thứ hạng của mình trên: Nearvember Leaderboard

Yêu cầu cơ bản:

  • Bạn cài đặt NodeJs, phiên bản từ 14 trở lên là tốt nhất:
    curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash –
    sudo apt-get install -y nodejs
    node -v
  • Bạn phải cài đặt Rustup. Đây là lệnh cài đặt trên môi trường mình sử dụng (Ubuntu 18.04.5 LTS):
    curl https://sh.rustup.rs -sSf | sh
    source $HOME/.cargo/env
    rustup target add wasm32-unknown-unknown
  • Bạn phải cài near-cli:
    npm install -g near-cli
  • Tạo tài khoản trên testnet từ địa chỉ: https://wallet.testnet.near.org/
    Trong bài này mình sử dụng tài khoản daothang.testnet đã tạo từ trước. Mình dùng tài khoản này làm tài khoản master, mỗi contract sẽ là sub-account được tạo từ tài khoản này.

Tài nguyên tham khảo:

Ngày 1: November 17th Challenge – Mint an NFT on NEAR

Chi tiết bạn xem tại link: November 17th Challenge – Mint an NFT on NEAR

Yêu cầu thử thách:

  • Triển khai hợp đồng thông minh NFT trên testnet
  • Mint một NFT
  • Chia sẻ lệnh trên kênh Discord #nearvember để xem các NFT do bạn sở hữu

Thực hiện:

Thử thách này đơn giản bạn chỉ cần tải ví dụ NFT trong bộ examples của NEAR, thực hiện build và chạy theo hướng dẫn. Các lệnh thực hiện:

// Tạo tài khoản con để triển khai smart contract
near create-account nft.daothang.testnet --masterAccount daothang.testnet --initialBalance 10

// Tải source code ví dụ NFT
git clone https://github.com/near-examples/NFT.git

// Thực hiện build
cd NFT/
./build.sh

// Triển khai smart contract
near deploy --accountId nft.daothang.testnet --wasmFile ./res/non_fungible_token.wasm

// Khởi tạo smart contract
near call nft.daothang.testnet new_default_meta '{"owner_id": "nft.daothang.testnet"}' --accountId nft.daothang.testnet

// Thực hiện mint NFT thứ nhất
near call nft.daothang.testnet nft_mint '{"token_id": "0", "receiver_id": "daothang.testnet", "token_metadata": { "title": "HaLong bay", "description": "Ha Long Bay, in the Gulf of Tonkin, includes some 1,600 islands and islets, forming a spectacular seascape of limestone pillars. Because of their precipitous nature, most of the islands are uninhabited and unaffected by a human presence.", "media": "https://halongbay.com.vn/Data/images/slide/slide5.jpg", "copies": 10}}' --accountId nft.daothang.testnet --deposit 0.1

// Mint NFT thứ 2
near call nft.daothang.testnet nft_mint '{"token_id": "1", "receiver_id": "daothang.testnet", "token_metadata": { "title": "HaLong bay", "description": "Ha Long Bay, in the Gulf of Tonkin, includes some 1,600 islands and islets, forming a spectacular seascape of limestone pillars. Because of their precipitous nature, most of the islands are uninhabited and unaffected by a human presence.", "media": "https://halongbay.com.vn/Data/images/slide/slide5.jpg", "copies": 10}}' --accountId nft.daothang.testnet --deposit 0.1

// Mint NFT thứ 3
near call nft.daothang.testnet nft_mint '{"token_id": "2", "receiver_id": "daothang.testnet", "token_metadata": { "title": "Ho Chi Minh Stamp", "description": "Newly released stamp celebrating President Ho Chi Minh 130th birthday anniversary and 50th anniversary of Ho Chi Minh Museum.", "media": "https://image.vietnamnews.vn/uploadvnnews/Article/2020/5/18/87100_stamp.jpg", "copies": 1}}' --accountId nft.daothang.testnet --deposit 0.1

// Transfer NFT đầu tiên tới tài khoản nearvember.testnet
near call nft.daothang.testnet nft_transfer '{"token_id": "0", "receiver_id": "nearvember.testnet", "memo": "Transfer NFT"}' --accountId daothang.testnet --deposit 0.000000000000000000000001

// Lệnh xem các NFT mà mình sở hữu
near view nft.daothang.testnet nft_tokens_for_owner '{"account_id": "daothang.testnet"}'

Thông tin giao dịch:

Deploy: https://explorer.testnet.near.org/transactions/AFMPZ5ckh2cKYqvQgDE5vgLW8PcEDGD9UYjrJifqkMJu
Mint: https://explorer.testnet.near.org/transactions/9Hrkc723CqbFVpHmWXQER7hxUKMFvkcU5EvMk4gzMpBi
Transfer: https://explorer.testnet.near.org/transactions/7HwsSAwkx4pXhR9T2Dhd87dEmZk3565Fe254GHbuBNeh
View commmand: near view nft.daothang.testnet nft_tokens_for_owner '{"account_id": "daothang.testnet"}'

Bài này đơn giản chỉ chạy lệnh, chưa cần code gì nên còn khá đơn giản. Nhưng cuối ngày mình mới biết tới chương trình này, tham gia muộn nên chưa được điểm cao, đứng thứ 79. Sẽ cố gắng vào các ngày sau.

Kết quả ngày 1: 100 điểm (Thứ hạng 79)

Ngày 2: November 18th Challenge – Write a Hello World smart contract

Chi tiết bạn xem tại link: November 18th Challenge – Write a Hello World smart contract

Yêu cầu thử thách:

  • Triển khai smart contract “Hello Worlld” trên Testnet => Có thể thêm tham số, thay đổi thông điệp… => Tự do sáng tạo
  • Chia sẻ lệnh trên kênh Discord #nearvember
  • Cộng điểm cho người dùng tương tác nhiều nhất

Thực hiện:

Bài này bạn phải học thêm ít kiến thức về RUST để code. Mình sử dụng
create-near-app
để tạo project mới:

// Tạo project hello-world
yarn create near-app --contract=rust hello-world
cd hello-world/

// Cài đặt các thư viện cần thiết
yarn

// Sửa tệp contract/src/lib.rs thêm hàm hello
// Chi tiết code xem phần dưới

// Build smart contract
yarn build:contract

// Tạo sub account để triển khai smart contract
near create-account hello.daothang.testnet --masterAccount daothang.testnet --initialBalance 2

// Deploy smart contract
near deploy --accountId hello.daothang.testnet --wasmFile out/main.wasm

// Gọi hàm hello, nhớ thử gọi nhiều lần
near view hello.daothang.testnet hello '{"account_id": "daothang.testnet"}'
near call hello.daothang.testnet hello '{"account_id": "daothang.testnet"}' --accountId daothang.testnet

Hàm hello() của mình sẽ trả về 1 trong 8 message khác nhau tùy vào thời điểm người gọi. Mình sử dụng thời gian trên blockchain để xác định message nào được trả về. Nội dung mã nguồn hàm hello() của mình như sau:

pub fn hello(&self, account_id: String) -> String {
    let ts = env::block_timestamp();
    let m = ts % 8;
    let mut message = "Hello world!".to_string();
    match m {
        1 => {
                message = "Hi, ".to_string();
                message.push_str(&account_id);
                message.push_str(". Nice to meet you!");
        },
        2 => {
            message = "Hi, ".to_string();
                message.push_str(&account_id);
                message.push_str(". Long time no see!");
        },
        3 => {
                message = "Hello, ".to_string();
                message.push_str(&account_id);
                message.push_str(". How do you do?");
        },
        4 => {
            message = "Hello, ".to_string();
                message.push_str(&account_id);
                message.push_str(". It is good to see you.");
        },
        5 => {
                message = "Hey ".to_string();
                message.push_str(&account_id);
                message.push_str(". How is it going?");
        },
        6 => {
                message = "Hey ".to_string();
                message.push_str(&account_id);
                message.push_str(". How are you?");
        },
        7 => {
                message = "Hi, ".to_string();
                message.push_str(&account_id);
                message.push_str(". Welcome to the NEAR ecosystem.");
        },
        _ => {
                message = "Hello world!".to_string();
        }
    }
    return message;
}

Bạn tham khảo thêm:

Ngày thứ 2 được bonus 200 điểm vì 1 trong các thành viên tương tác nhiều. Nhưng thực sự để giành được điểm này khá tốn time nên lần sau chỉ tập trung vào phần chính.

1 trong 5 thành viên tương tác nhiều
1 trong 5 thành viên tương tác nhiều

Kết quả ngày 2: 420 điểm (Thứ hạng 5)

Ngày 3: November 19th Challenge – Build a simple frontend for your Hello World contract

Chi tiết bạn xem tại link: November 19th Challenge – Build a simple frontend for your Hello World contract

Yêu cầu thử thách:

  • Triển khai giao diện người dùng (Đơn giản nhất là trên Github)
  • Chia sẻ liên kết trên kênh Discord #nearvember
  • Có điểm thưởng cho UI ấn tượng, và 5 người dùng hữu ích nhất (the most helpful users)

Thực hiện:

Bài này mình vẫn sử dụng project của bài 2 được tạo từ create-near-app. Nó đã có sẵn giao diện, và mình chỉ việc chỉnh sửa nó cho phù hợp.

Ngoài ra, bạn có thể tham khảo source code frontend từ:
near-challange3-helloworld
hoặc từ NearContract (Tạo từ create-near-app)

Mình public kết quả lên địa chỉ: https://usoftvn.github.io/challenge-03/

Kết quả ngày 3: 590 điểm (Thứ hạng 14)

Ngày 4: November 20th – 21st – Challenge Modify and deploy the guest book example

Chi tiết bạn xem tại link: November 20th – 21st Challenge – Modify and deploy the guest book example!

Yêu cầu thử thách:

  • Chỉnh sửa contract và frontend của Guest Book.
  • Triển khai nó
  • Cộng điểm:
    • Thay đổi style của UI
    • Chỉ cho phép 1 tài khoản chỉ được ký 1 lần
    • Hỗ trợ lấy nhiều hơn 10 message

Thực hiện:

Cái này bạn chỉ việc clone Guest Book về sửa thôi, tùy theo sáng tạo của bạn. Bài này mình có 2 vấn đề gặp phải:

  • Mình sử dụng máy windows để code nhưng không build được trên Windows => Phải build và sửa trên VPS nên hơi mất thời gian. Sau khi run trên VPS phải forward port về local để chạy bằng lệnh (Do VPS bảo mật chỉ mở port 22):
    ssh -L 1234:127.0.0.1:1234 <user>@<VPS-IP>
  • Mình không biết về ReactJs => Vừa làm vừa search.

Mình public kết quả lên địa chỉ: https://usoftvn.github.io/challenge-04/

Kết quả ngày 4: 1200 điểm (Thứ hạng 18)

Ngày 5: November 22nd Challenge Build a simple frontend to connect with your NFT smart contract

Chi tiết bạn xem tại link: November 22nd Challenge – Build a simple frontend to connect with your NFT smart contract

Yêu cầu thử thách:

  • Tạo frontend cho NFT contract mà bạn đã build từ Challenge #1
  • Deploy frontend lên đâu đó như Github chẳng hạn
  • Chia sẻ link vào Discord channel #challenge-5-nft-frontend
  • Cộng điểm:
    • Frontend ấn tượng nhất.

Thực hiện:

Giao diện ta clone từ giao diện của Hello World từ trước và chỉnh sửa. Ta tạo lại smart contract để gán Owner mới.

// Tạo tài khoản con để triển khai smart contract
near create-account nft1.daothang.testnet --masterAccount daothang.testnet --initialBalance 10

// Triển khai smart contract
near deploy --accountId nft1.daothang.testnet --wasmFile ./res/non_fungible_token.wasm

// Khởi tạo smart contract
near call nft1.daothang.testnet new_default_meta '{"owner_id": "daothang.testnet"}' --accountId daothang.testnet

Mình public kết quả lên địa chỉ: https://usoftvn.github.io/challenge-05/
Giao diện hỗ trợ:

  • Hiển thị danh sách thu gọn toàn bộ NFT.
  • Cho phép hiển thị thông tin chi tiết của NFT. Thông tin này người dùng có thể ẩn hiện theo ý muốn.
  • Cho chuyển NFT tới người khác, giao diện transfer có thể ẩn hiện theo ý muốn
  • Giao diện cho phép đúc NFT. Chỉ owner mới hiển thị giao diện này.
Giao diện cho account thường và tài khoản owner
Giao diện cho account thường và tài khoản owner

Kết quả ngày 5: 1550 điểm (Thứ hạng 11)

Ngày 6: November 23rd Challenge – Create and deploy a transfer service for your own fungible token

Chi tiết bạn xem tại link: November 23rd Challenge – Create and deploy a transfer service for your own fungible token

Yêu cầu thử thách:

  • Triển khai contract FT smart contract example trên Testnet
  • Tạo giao diện giúp người dùng chuyển token và triển khai frontend

Thực hiện:

Đầu tiên ta thêm hàn ft_claim() vào smart contract để cho người dùng tiện claim token cho việc test:

pub fn claim(&mut self) {
    self.token.internal_deposit(&env::signer_account_id(), u128::from_str_radix("10000000000", 10).unwrap());
}

Sau đó bạn có thể đổi tên token để khởi tạo cho nhanh, hoặc không cần cũng được. Bây giờ ta sẽ triển khai contract trước (Contract tôi có sửa chút để thêm hàm Claim cho tiện):

// Tải source code và thực hiện build
git clone https://github.com/near-examples/FT.git
cd FT
./build.sh

// Tạo tài khoản con để triển khai smart contract
near create-account ft3.daothang.testnet --masterAccount daothang.testnet --initialBalance 10

// Triển khai smart contract
near deploy --accountId ft3.daothang.testnet --wasmFile ./res/fungible_token.wasm

// Khởi tạo contract, bạn có thể dùng hàm new() hoặc hàm new_default_meta()
near call ft3.daothang.testnet new_default_meta '{"owner_id": "daothang.testnet", "total_supply": "1000000000000000"}' --accountId ft3.daothang.testnet

// Xem thông tin token
near view ft3.daothang.testnet ft_metadata

// Xem thông tin tài khoản
near view ft3.daothang.testnet ft_balance_of '{"account_id": "daothang.testnet"}'

// Trước khi transfer tới bitcoindefi.testnet thì tài khoản này phải đăng ký trước bằng lệnh
near call ft3.daothang.testnet storage_deposit '' --accountId bitcoindefi.testnet --amount 0.00125

// Transfer token
near call ft3.daothang.testnet ft_transfer '{"receiver_id": "bitcoindefi.testnet", "amount": "10000000000"}' --accountId daothang.testnet --amount 0.000000000000000000000001

Bây giờ chúng ta tạo giao diện, phần này tùy từng người thôi. Giao diện hỗ trợ:

  • Hiển thị thông tin token
  • Hiển thị số lượng token trong ví
  • Hỗ trợ đăng ký token
  • Hỗ trợ claim token
  • Hỗ trợ transfer token

Mình public kết quả lên địa chỉ: https://usoftvn.github.io/challenge-06/

Giao diện UI
Giao diện UI

Kết quả ngày 6: 1990 điểm (Thứ hạng 9)

Ngày 7: November 24th Challenge – Create and deploy a voting smart contract

Chi tiết bạn xem tại link: November 24th Challenge – Create and deploy a voting smart contract

Yêu cầu thử thách: Tạo và triển khai voting smart contract có các phương thức sau:

  • Thêm ứng cử viên: Thêm một ứng cử viên tiềm năng mà người dùng có thể bỏ phiếu
  • Xem các ứng cử viên: xem tất cả các ứng cử viên và số phiếu bầu mà họ có
  • Bình chọn: Bất kỳ ai có ví GẦN đều có thể bình chọn cho một ứng cử viên một lần

Thực hiện:

Bạn có thể tham khảo 1 số trang sau:

Mục tiêu tôi sẽ xây dựng contract hỗ trợ các chức năng sau:

  • Cho phép tạo nhiều vote
  • Hỗ trợ thêm nhiều ứng viên cho mỗi vote
  • Bất kỳ ai có ví NEAR đều có thể vote cho ứng viên, và mỗi người chỉ được vote 1 lần ứng mỗi vote.
  • Xem thông tin chi tiết vote hiện tại và vote bất kỳ

Đầu tiên ta tạo ứng dụng voting-app, contract viết bằng AssemblyScript (Tôi quên ngôn ngữ này hơn RUST). Chi tiết bạn xem bài viết: How to writing a voting app (Smart contract + Frontend) on NEAR

Bây giờ chúng ta thực hiện build và triển khai:

// Tạo sub-account
near create-account voting.daothang.testnet --masterAccount daothang.testnet --initialBalance 20

// Build và triển khai contract
yarn build:contract
near deploy --accountId voting.daothang.testnet --wasmFile ./out/main.wasm

Bây giờ ta chạy thử bằng near-client, luồng voting của chúng ta như sau:
createVoting -> addCandidate() -> startVote() -> vote() -> endVote()

// Create new voting
near call voting.daothang.testnet createVoting '{}' --accountId daothang.testnet

// Add candidates for current voting
near call voting.daothang.testnet addCandidate '{"candidate": "Donald Trump"}' --accountId daothang.testnet
near call voting.daothang.testnet addCandidate '{"candidate": "Joe Biden"}' --accountId daothang.testnet

// Start voting
near call voting.daothang.testnet startVote '{}' --accountId daothang.testnet

// Everyonce can vote
near call voting.daothang.testnet vote '{"candidateId":0}' --deposit 0.5 --accountId <account1>
near call voting.daothang.testnet vote '{"candidateId":0}' --deposit 0.5 --accountId <account2>
near call voting.daothang.testnet vote '{"candidateId":1}' --deposit 0.5 --accountId <account3>

// End voting to latch result
near call voting.daothang.testnet endVote '{}' --accountId daothang.testnet

Bạn có thể xem vote hiện tại ở bất kỳ thời điểm nào, nếu có nhiều vote thì bạn có thể xem vote trước đây:

// Xem vote hiện tại/Vote mới nhất
near view voting.daothang.testnet votingInfo '{}'
// Thông tin của vote trả về như sau:
//{
//  id: 0,
//  owner: 'daothang.testnet',
//  status: 2,
//  startTime: '1637840126874226050',
//  startBlock: '72710314',
//  endTime: '1637840350426559158',
//  endBlock: '72710597',
//  candidates: [
//    { id: 0, name: 'Donald Trump', vote: 2 },
//    { id: 1, name: 'Joe Biden', vote: 1 }
//  ]
//}

// Xem vote bất kỳ
near view voting.daothang.testnet votingInfoById '{"votingId":0}'

Kết quả ngày 7: 2870 điểm (Thứ hạng 10)

Ngày 8: November 26th Challenge – Create and deploy a frontend for your voting smart contract

Chi tiết bạn xem tại link: November 26th Challenge – Create and deploy a frontend for your voting smart contract

Yêu cầu thử thách: Tạo và triển khai frontend cho voting smart contract.

Thực hiện:

Thực hiện sửa phần frontend của Ngày 8. Chi tiết source source xem tại: near-voting-app

Đây kết kết quả: Voting App Demo

Giao diện Voting App
Giao diện Voting App

Kết quả ngày 8: 3590 điểm (Thứ hạng 9)

Ngày 9: November 29th Challenge – Cross-contract calling challenge

Chi tiết bạn xem tại link: November 29th Challenge – Cross-contract calling challenge

Yêu cầu thử thách: Tạo 2 smart contract trong đó, smart contract này sẽ gọi smart contract kia.

Thực hiện:

Ý tưởng đưa ra là cung cấp cơ chế thưởng cho người dùng, người dùng sử dụng ứng dụng càng nhiều thì càng được thưởng nhiều token. Mình tạo ra 2 contract:

  • MainContract: Có chức năng chính của ứng dụng, đồng thời cài đặt cơ chế để đếm số lượng thao tác của người dùng.
  • BonusContract: Là contract tính toán số lượng token mà user được thưởng. Để tính được thì BonusContract phải lấy thông tin số thao tác người dùng thực hiện trên MainContract bằng cách gọi hàm userActionInfo() của MainContract.

Mã nguồn của MainContract như sau:

import { Context, logging, storage, PersistentMap } from 'near-sdk-as'

const OWNER_KEY = "OWNER_ACCOUNT";
const CONTRACT_CLAIM_KEY = "CONTRACT_CLAIM_ACCOUNT";

@nearBindgen
export class ActionInfo {
  claimActionCount: i32;
  userActionCount: i32;
  constructor() {
    this.claimActionCount = 0;
    this.userActionCount = 0;
  }
}

const actionInfos = new PersistentMap<string, ActionInfo>("action_infos");

function updateActionInfo(account: string): boolean {
  let actionInfo = actionInfos.get(account, null);
  if (actionInfo==null) {
    actionInfo = new ActionInfo();
  }
  actionInfo.userActionCount++;
  actionInfos.set(account, actionInfo);
  return true;
}

export function login(): boolean {
  return updateActionInfo(Context.sender);
}

export function doAction1(): boolean {
  return updateActionInfo(Context.sender);
}

export function doAction2(): boolean {
  return updateActionInfo(Context.sender);
}

export function setOwner(newOwner: string): boolean {
  let owner = storage.get<string>(OWNER_KEY, null);
  if (!owner) {
    storage.set<string>(OWNER_KEY, newOwner);
    return true;
  } else if (owner==Context.sender) {
    storage.set(OWNER_KEY, newOwner);
    return true;
  }
  return false;
}

export function setClaimContract(contract: string): boolean {
  let owner = storage.get<string>(OWNER_KEY, null);
  if (owner==Context.sender) {
    storage.set<string>(CONTRACT_CLAIM_KEY, contract);
    return true;
  }
  return false;
}

export function updateClaimActionCount(account: string, count: i32): boolean {
  let claimContract = storage.get<string>(CONTRACT_CLAIM_KEY, null);
  let actionInfo = actionInfos.get(account, null);
  if (claimContract && actionInfo && Context.predecessor==claimContract) {
    actionInfo.claimActionCount = count;
    actionInfos.set(account, actionInfo);
  }
  return true;
}

export function userActionInfo(account: string): ActionInfo {
  let actionInfo = actionInfos.get(account, null);
  if (actionInfo==null) {
    actionInfo = new ActionInfo();
  }
  return actionInfo;
}

Mã nguồn của BonusContract như sau:

import { Context, ContractPromise, u128, logging } from "near-sdk-core";

@nearBindgen
class UserActionInfo {
    account: string;
}

@nearBindgen
class ActionInfo {
    claimActionCount: i32;
    userActionCount: i32;
}

@nearBindgen
class Nothing {}

export function getBonusTokenAmount(): void {
    ContractPromise.create<UserActionInfo>(
        "mainapp.daothang.testnet",
        "userActionInfo",
        {
            account: Context.sender,
        },
        5_000_000_000_000,
        u128.Zero
    ).then<Nothing>(
        Context.contractName,
        "getBonusTokenAmountCallback",
        {},
        5_000_000_000_000,
        u128.Zero
    ).returnAsResult();
}

export function getBonusTokenAmountCallback(): i32 {
    const results = ContractPromise.getResults();
    const result = results[0];
    const actionInfo = result.decode<ActionInfo>();
    return (actionInfo.userActionCount - actionInfo.claimActionCount)*10;
}

Thông tin triển khai:

// Người dùng tương tác với MainContract
near call mainapp.daothang.testnet login '{}' --accountId daothang.testnet
near call mainapp.daothang.testnet doAction1 '{}' daothang.testnet
near call mainapp.daothang.testnet doAction1 '{}' daothang.testnet
near call mainapp.daothang.testnet doAction2 '{}' daothang.testnet

// Có thể kiểm tra thông tin người dùng tương tác bằng lệnh
near view mainapp.daothang.testnet userActionInfo '{"account":"daothang.testnet"}'

// Người dùng kiểm tra số lượng token mà mình sẽ được thưởng
near call bonus.daothang.testnet getBonusTokenAmount '{"account":"daothang.testnet"}' --accountId daothang.testnet

Kết quả ngày 9: 4450 điểm (Thứ hạng 12)

Ngày 10: November 30th Challenge – FREE FOR ALL

Chi tiết bạn xem tại link: November 30th Challenge – FREE FOR ALL

Yêu cầu thử thách: Tạo smart contract hoặc frontend theo ý bạn. Không có giới hạn gì cả.

Thực hiện: Tôi dùng lại bản demo NMS trước đây tham gia NEAR Certified Developer Level 1

Kết quả ngày 10: 5350 điểm (Thứ hạng 13)

Ngày 11: December 2nd Challenge – Write a tutorial for NEAR newbies

Chi tiết bạn xem tại link: December 2nd Challenge – Write a tutorial for NEAR newbies

Yêu cầu thử thách: Viết hướng dẫn cho người mới bắt đầu tham gia NEAR và đăng bài trên Twitter.

Thực hiện: Nộp bài muộn => Hy vọng được chấp nhận

Kết quả ngày 11: 6190 điểm (Thứ hạng 17)

Ngày 12: December 3rd Challenge – MEME CONTEST!

Chi tiết bạn xem tại link: December 3rd Challenge – MEME CONTEST!

Yêu cầu thử thách: Reply tweet bằng MEME. Lúc đầu thấy nhiều anh em tạo MEME khá chất cũng khâm phục. Sau phát hiện ra có trang này để tạo MEME: https://imgflip.com/memegenerator

Thực hiện:

Kết quả ngày 12: 6490 điểm (Thứ hạng 19)

===> KẾT QUẢ CUỐI CÙNG: Top 15 được nhận thưởng, mình đứng thứ 19 nên không được => Khá buồn

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 8

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

Trả lời

Giao diện bởi Anders Norén