บันทึกการเรียนรู้ NEAR ผ่าน NEAR 101 Workshop

Published on
NEAR
near-101
Discord

NEAR เป็นอีกหนึ่ง Blockchain ที่ผมสนใจรองลงมาจาก Solana เพราะด้วยทั้งสองใช้ภาษา Rust ซึ่งเป็นภาษาที่ผมกำลังหัดเขียนอยู่พอดี จริงๆ Terra, Polkadot, Mina, Elrond หรือหลายๆตัว ผมก็สนใจนะ แต่ขอ focus ทีละน้อยก่อน เยอะไปกลัวจะหลุด 🤣

Rust in Blockchain - มีทั้ง newsletter, blog post และรวบรวม awesome RiB เผื่อหลายๆคนสนใจ

กลับมาที่บทความนี้ บทความนี้จะเป็นบันทึกสิ่งที่ผมเรียนจาก Workshop NEAR 101 ในช่วง 3-4วันของผมนะครับ การเรียนคือผมไม่ได้อ่าน Slide แล้วจบ คือในช่วง 3-4วันนี้ ผมก็อ่าน Slide ไปด้วย ลองทำแอพง่ายๆ กลับมาอ่านใหม่ วนๆ ไป บางทีก็ไปลองทำตาม Example ฉะนั้น เนื้อหามันก็อาจจะไม่ตรง Slide ซะทีเดียวนะครับ แต่ถือว่าเป็น Guide ให้ผมได้เยอะเลย

Workshop Preparation

Web2 -> Web3

พูดถึงภาพรวมจาก Web2 เป็น Web3 จริงๆ แล้วก็เป็นเรื่องทั่วๆไป ภาพรวม อันนี้ไม่มีอะไรใหม่

topology

  • ตัว app dev technogogy ถ้าเป็น Web2 จะใช้ JavaScript เป็น Frontend ส่วน Backend ก็ภาษาหลากหลายเต็มไปหมด
  • ถ้าฝั่ง Web3 ตัว frontend ก็ยังเป็น JavaScript และหลังบ้านเป็น Rust หรือ AssemblyScript (NEAR)

Security

  • แบบ Web2 ตัว account จะเก็บ username / password หรือจะใช้พวก oAuth
  • ถ้าเป็น Web3 จะใช้เป็น key pairs (public / private key)
  • ตัว server แบบ Web2 ก็เช่น AWS / GCP / Azure
  • ตัว server ฝั่ง Web3 ก็คือ Web2 + consensus (PoW, PoS, อื่นๆ)

Guestbook

  • Guestbook - ที่เป็นตัวอย่าง starter โค๊ดเป็น AssemblyScript / React มี 2 folders คือ
  1. assembly - เก็บไฟล์ smart contract และ tests.
  2. src - เป็นส่วน UI และ test.
  3. จริงๆ มี neardev ซึ่งเก็บ contract account. (เอาไว้เทส / ห้ามแชร์ public/private key เด็ดขาด)

NEAR Contract

ถ้าเราจะพัฒนา Smart Contract เรามี 2 ทางเลือก

  1. dApp Contract

โดยตัว Smart Contract ที่เราเขียน ไม่ว่าจะใช้ภาษา Rust หรือ AS (AssemblyScript) ก็ต้อง compile เป็น Web Assembly (WASM) อยู่ดี

ข้อดีข้อเสียของ AssemblyScript และ Rust?

  • Assembly Script หรือ AS จะมี syntax คล้ายๆ TypeScript ทำให้คนที่เขียน JS/TS น่าจะเข้าใจไม่ยาก
  • Rust ยากกว่า และ learning curve สูง แต่เหมาะกับ high value contract.

อ่านเพิ่มเติม Near sdk - Getting Started

  1. dApp UX (Frontend)
  • ส่วนของ Frontend จะใช้หลักๆ คือ near-api-js สำหรับติดต่อ contract, จัดการกับ account เป็นต้น
  • ส่วน JSON-RPC API ก็ใช้ได้ทุกๆภาษา ที่รองรับ RPC Interface ครับ

Create Near App

สำหรับคนที่มีพื้นฐานมาแล้ว หรืออยากได้โปรเจ็คไวๆ ก็มี create-near-app แบบเดียวกับ Create React App หรือ Create Next App ครับ

npx create-near-app --help
  • เราสามารถเลือก Frontend ได้ แบบ HTML/JS ธรรมดา (vanilla) ซึ่งเป็นค่า default หรือจะเป็น React / Vue / Angular ก็ได้
  • ฝั่ง contract ก็เลือกได้ว่าจะใช้ AssemblyScript หรือ Rust (defualt เป็น AS)
npx create-near-app myapp --contract=rust --template=react

Near Explorer

Near Explorer เอาไว้ดู Account Id, Transaction, Block Hash และรายละเอียดอื่นๆ เหมือนๆกับฝั่ง Ethereum ที่มี etherscan ครับ

แต่ข้อเสียคือ ผมรู้สึกว่า UX มันยังทำได้ไม่ดี และการดูข้อมูล มันก็แอบดูยาก และไม่ค่อยตรงกับความต้องการเท่าไหร่ เราสามารถเลือกเปลี่ยน Testnet หรือ Mainnet ได้เลย

Near Wallet

Near Wallet คือสิ่งที่ต้องมี ในการเขียน Smart Contract หรือใช้ในการ call contract สิ่งที่ต้องรู้คือ

  • เก็บข้อมูลใน LocalStorage
  • key ชื่อมี format near-api-js:keystore:<ACCOUNT_ID>:mainnet
  • value คือ private key (ฉะนั้นใครเข้าถึง browser ก็ได้ public/private key เลย)

NEAR CLI

NEAR CLI - เป็น Command Line สำหรับ interact กับ NEAR Blockchain

เราสามารถจัดการกับ Access keys หรือ Accounts หรือ Contracts ได้ผ่าน near cli ตัวอย่าง คร่าวๆ เช่น ทำการ login ทำการสร้าง Account ส่ง Token หรือ deploy contract เรียก contract เป็นต้น

# login โดยใช้ near wallet มันจะเด้งไปให้เรา confirm
near login

# generate key
near generate-key

# send token
near send <sender> <receiver> <amount>

# deploy contract
near deploy <account> <file>

# เรียก call/view
near view <contarct> <method>
near call <contract> <method> <args>

NEAR API JS

  • NEAR-API-JS (JavaScript Library) เป็น Library ที่เอาไว้ connect NEAR จากฝั่ง JavaScript (ได้ทั้ง Server/ Client)
  • ทำพวก generate keypair, สร้าง transaction, sign transaction.
  • จัดการ account, key store, contract, wallets ติดต่อ RPC
  • ถ้าดูจากหน้าที่ ก็คล้ายๆ web3.js หรือ ethers.js
yarn add near-api-js

Connect

import { connect, keyStores } from 'near-api-js'

const near = await connect({
    networkId: 'testnet',
    nodeUrl: 'https://rpc.testnet.near.org',
    keyStore = new keyStores.BrowserLocalStorageKeyStore()
})

สำหรับ KeyStore:

  • ฝั่ง Client ใช้ BrowserLocalStorageKeyStore
  • ฝั่ง Server ใช้ UnencryptedFileSystemKeyStore

Accounts Transactions & State

Accounts

  • NEAR Accounts จะอ่านง่าย เหมือน DNS Naming เช่น alice.near, bob.near
  • Account ID ต่ำสุด 2 ตัวอักษร มากสุด 64 (ไม่นับ .near)
  • มี subaccount ได้ (มองคล้ายๆ subdomain)
  • อ่านเพิ่มเติม NEAR - Account

Transactions

  • รวม 1 หรือหลายๆ action (ปกติมี 8 actions)
  • transaction ที่เปลี่ยน state ต้อง sign ด้วย NEAR Account.
  • อ่านต่อเรื่อง NEAR - Transaction

State

  • เก็บเป็น key-value
  • จ่ายด้วยการใช้ storage staking (Account ที่เป็นเจ้าของ Smart Contract ต้อง stake)
  • 1 NEAR Account มีหรือไม่มี contract ก็ได้ แต่มีได้แค่ 1 Contract.

Cross Contract & Testing

  • Cross contract คล้ายๆกับ Promise ของ JavaScript อาจจะ return หรือไม่ return value ก็ได้
  • Cross Contract เราแบ่งเป็น
  1. External Call - คือเรียกจาก Client-side
  2. Interal call - เรียกจาก contract code.
  • รองรับการเรียกแบบ batch และ promise ทั้งคู่
const myPromise = new Promise(myExecutorFunc)
  .then(handleFulfilledA)
  .then(handleFulfilledB)
  .then(handleFulfilledC)
  .catch(handleRejectedAny);
  • ส่วน Testing ถ้าเป็น AssemblyScript ใช้ as-pect ส่วนของ Rust ก็เทสผ่าน #[test] ปกติเลยครับ

และเหมือนว่า as-pec จะไม่รองรับ AssemblyScript เวอร์ชั่น 0.20.x นะครับ ต้องใช้เวอร์ชั่นต่ำกว่า เช่น 0.19.x

Create Near App

หลักจากที่ผมอ่านจบ และลองทำตามเล็กน้อย ก็ได้ลองไปหัดทำ Smart Contract / เปิด NEAR Example / อ่าน Doc เพิ่มเติม ตัว create-near-app เหมือนจะมีปัญหา dependencies ไม่ครบ ผมต้องมาลง asbuild กับ near-sdk-as เพิ่มเติม

npm install asbuild near-sdk-as --save-dev

แล้วถ้าใครใช้ Mac M1 จะเจอปัญหา ตอนลง near-sdk-as อีก แก้ด้วยการใช้ --ignore-scripts

npm install --save-dev --ignore-scripts near-sdk-as

สรุป

หลังจากอ่าน NEAR 101 - Workshop ลอง clone app ลองดู NEAR Example นั่งดูโปรเจ็คใน Github - Learn-NEAR และ NEAR University ก็พบว่า มีอะไรให้ผมได้อ่าน ได้เรียนรู้อีกเยอะ และนี้ก็เป็นแค่เริ่มต้น ทำให้เราได้เห็นภาพมากขึ้น แม้ว่าเนื้อหาหลายๆอย่าง อาจจะไม่ค่อยอัพเดท แต่มันก็เป็น reference หรือถ้าเจอ issue มันก็ทำให้เราได้เรียนรู้ เหมือนทำงานจริงๆนั่นแหละครับ

จริงๆแล้วไม่ว่าจะเริ่มต้นเรียน หรือหัดเขียนภาษาอะไรก็แล้วแต่ ช่วงแรกๆ ข้อมูลมักจะเยอะแยะ กระจัดกระจายเต็มไปหมด เดี๋ยวพอค่อยๆ ศึกษา มันก็จะค่อยๆ กระชับและตรงสิ่งที่เราสนใจมากขึ้น ช่วงนี้อาจจะเห็นผมสนใจเต็มไปหมด ไม่ต้องแปลกใจนะครับ 🤣

Happy Coding ❤️

Buy Me A Coffee
Authors
Discord