KiemTienOnline360

Chia sẻ hành trình kiếm tiền online bắt đầu từ con số 0

Kiến thức Blockchain, Kiến thức lập trình, Kiến thức MMO, Kỹ nghệ phần mềm

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:

Thực hiện:

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

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