Làm chủ hệ điều hành linux
Nguyễn Quang Minh
Tài nguyên chuẩn bị
● Xem clip kiến thức cơ bản blockchain defi … từ Chuyên gia, Tiến sĩ Việt. Cố gắng theo thứ tự đã đánh số: https://dathoc.net/bbc
● Ebook: https://dathoc.net/bookbc
● Máy tính nên có ít nhất 4 lõi cpu, ram nên là từ 8GB ram, free hdd 70gb, để tạo máy ảo ubuntu (2gb ram, 60gb hdd)
● Cài oracle vbox
//using Oracle Vbox version 64bit (https://www.virtualbox.org/wiki/Downloads )
//tải iso Ubuntu OS Server (không phải desktop) - 16.x hoac 18.x (https://ubuntu.com/download/server/step2 )
//CÓ 2 CÁCH SETUP
// 1. Xem clip setup Ubuntu: https://www.youtube.com/watch?v=2mjX-tVcGeA&t=6s
// 2. HOẶC, lấy gói máy ảo cho Oracle Vbox đã cài sẵn get .OVA virtualbox 2GB file from _projects to import to run (user/pass=b/1) (link: https://drive.google.com/file/d/1dN0DfDjOS1rbT5DqUJ-c92CnPRC2dBy-/view?usp=sharing )
Lệnh Linux cơ bản
//mở máy ảo ubuntu trên vbox
//view ip
ip a
//một số lệnh cơ bản ubuntu
//vào folder
cd <đường dẫn>
//ra khoi 1 tầng folder
cd ..
//về hosting
cd ~
//về thư mục gốc
cd /
//list
ls
//search
crt+w
//restart
sudo reboot -i
//power off
sudo poweroff
//check dung luong o dia
df
//xem và sửa file
nano <têm file>
//sau đó lưu
<nhấn crt+o>
<thoát/thoát không lưu crt+x>
//tạo folder
mkdir<tên>
//xoá folder
rm -rf <tên folder>
//exit in middle of nowhere
ctr+C
ctr+D
ctr+X
//khởi động lại server
systemctl reboot -i
//copy file from server to server, server should have openssh installed
//from ip_server_1, copy to ip_server_2 desktop
scp -r <file_path> <user>@<ip_server_2>:~/
vd: scp -r '/home/kj/abc.text' [email protected]:~/
//cài jdk và openssh
//kiểm tra jdk và ssh sau khi cài cắm
java -version
ssh -V
Check file size, and remove big files
//check vol
df
//check large files
sudo find $HOME -type f -size +1024M -exec ls -sh {} +
//xem file can xoa
//xoa <file x>
rm -rf <file x>
Setup docker, solidity, fe, nodejs, go, cadence, rust utils
//các setup này cho Ubuntu, vậy bạn làm luôn trên máy ảo Ubuntu đã cài cắm ở trên
//update util
sudo apt-get update
sudo apt-get install build-essential git cmake nano tar zip curl unzip pkg-config python3-dev
wget https://dathoc.net/get-pip.py --no-check-certificate
sudo python3 get-pip.py
Anaconda virtual envi
//tren may ao ubuntu server 16.04
//setup anaconda
//setup Anaconda, vao https://docs.anaconda.com/anaconda/install/
//download suitable version https://docs.anaconda.com/anaconda/install/index.html
wget https://repo.anaconda.com/archive/Anaconda3-2021.11-Linux-x86_64.sh
//set run file
sudo chmod +x <file vua down>
//setup anaconda, run <file vua down>
./Anaconda3-2019.03-Linux-x86_64.sh -u
//enter va yes lien tuc, cho toi khi xong
//can reboot/logout moi dung dc lenh conda
sudo systemctl reboot -i
//creat new envi
conda create -n abc python=3.8
conda activate abc
Working with Git
//install git: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
//sau do xem sheet sau va practice
Docker
//setup docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
apt-cache policy docker-ce
sudo apt-get install -y docker-ce
//setup docker compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-composeuname -suname -m
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
//set docker root
sudo usermod -aG docker ${USER}
su - ${USER}
id -nG
sudo usermod -aG docker
//tap build docker voi project appnode.zip
Lệnh Docker cơ bản
//docker img list
docker images
//list containerV docker ps
//remove container
docker container stop $(docker container ls -aq)
docker container rm $(docker container ls -aq)
//remove all img
docker system prune -a
//kill, stop container before remove
docker kill/stop
//start cache
docker start $(docker ps -aq)
//force remove docker cache
docker rm -f $(docker ps -aq)
//clear docker network
docker network prune
//copy all file FROM docker ID Container:<path folder on docker> to current folder
docker cp <ID Container>:<path folder on docker> .
//copy from local to docker ID Container:<path folder on docker>
docker cp '<path to folder>' <id container>:<path folder on docker>
//docker restart
docker container restart <id container>
//go inside docker
docker exec -it <id container> /bin/bash
Nodejs, Go, Solidity, Cadence…
//setup nodejs
//setup nodejs 12
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install nodejs
//setup go lang
wget https://go.dev/dl/go1.17.8.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.17.8.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
//create go dependencies folder
cd ~
mkdir go
//set path to ~/.bashrc
nano ~/.bashrc
//copy paste
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin
//save, ctr+o, ctr+x
source ~/.bashrc
//test
go
//setup Metamask wallet
//search Google “chrome metamask” to install
//setup Flow Port wallet
//setup Phantom wallet
search Google “Phantom” to install
//check Solidity coding, remix solidity editor
//try Hardhat https://hardhat.org/getting-started/
//setup FE-lang
https://github.com/ethereum/fe/tree/master/crates/test-files/fixtures/demos
https://github.com/ethereum/fe
Cadence
//check cadence
https://docs.onflow.org/cadence/tutorial/02-hello-world/
//setup vscode for cadence
https://github.com/onflow/vscode-cadence
Rust
//setup rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update
//test
cargo
//test coding with openzepperlin https://docs.openzeppelin.com/contracts/4.x/
Kafka
//build and run docker kafka multinodes
//tren may ao ubuntu server 16.04
//docker https://github.com/wurstmeister/kafka-docker
//basic: https://kafka.apache.org/quickstart
//test via python
pip install kafka-python
https://kafka-python.readthedocs.io/en/master/
Couchdb
//build and run couchdb node
//tren may ao ubuntu server 16.04
//setup couch db
//tu docker
sudo docker run -d --name couchdb -p 5984:5984 -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=123 couchdb
//hoac setup manually
//ubuntu 16
curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -
sudo apt-get update && sudo apt-get install couchdb
//check localhost:5984
//example get db herelll to json format
curl -X GET http://127.0.0.1:5984/herelll/_all_docs?include_docs=true > herelll2.json
//ubuntu 16
curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -
echo "deb https://apache.bintray.com/couchdb-deb xenial main" | sudo tee -a /etc/apt/sources.list.d/apache_couchdb_xenial.list
sudo apt-get update
sudo apt-get install couchdb
//check <ip may ao>:5984
curl -X GET http://127.0.0.1:5984
//phai ko bao loi, ra vesion
//turbo per
sudo nano /opt/couchdb/etc/default.ini
[couchdb]
ERL_MAX_PORTS=4096
max_dbs_open = 5000
[chttpd]
server_options = [{backlog, 128}, {acceptor_pool_size, 16}, {max, 4096}]
//restart
/etc/init.d/couchdb restart
//check running
/etc/init.d/couchdb status
//restart
/etc/init.d/couchdb restart
Redis
//build and run in-memory redis db node
//tren may ao ubuntu server 16.04
//docker
docker run --name myredis -d -p 6379:6379 redis redis-server --requirepass "abcxyz123"
//manually
//setup redis
sudo apt update
sudo apt install redis-server
//test redis
sudo systemctl start redis.service
//check
redis-cli
//auth
sudo nano /etc/redis/redis.conf
//set system
supervised systemd
//change pass
requirepass <yourpass - sdsfewrw2343#@!#$>
//rename danger commands
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOTkj55
rename-command CONFIG ASC12_CONFIGkj55
//bind only local
bind 127.0.0.1 ::1
//restart
sudo systemctl restart redis.service
//test
sudo systemctl status redis
//disable redis
sudo systemctl disable redis
ELK
//tren may ao ubuntu server 16.04
//build docker https://github.com/deviantony/docker-elk
//install chrome elasticvue
//with filebeat https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation-configuration.html
//a demo
Python & Flask
Kiến thức qua Youtube, Blog ngôn ngữ lập trình, database học trước
● Xem clip kiến thức cơ bản blockchain defi nft … từ Chuyên gia, Tiến sĩ Việt. Cố gắng theo thứ tự đã đánh số: https://dathoc.net/bbc
● Học cơ bản oop, git, thiết kế database, unit testing, đạo đức nghề nghiệp
https://www.youtube.com/watch?v=67fIkaxyvHs&list=PL751V5I3RIDEWVxgWbiRzf98rFcV7mxWM
https://www.youtube.com/watch?v=Gcv5gz5rUw4&list=PL751V5I3RIDGiP56tBJpaUv1LDtdvwEFA
● Blockchain scaling: https://ethereum.org/en/developers/docs/scaling/
● Kiến trúc Web3 (không phải web3.js): https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application
● Cefi & Defi: https://ethereum.org/en/developers/docs/web2-vs-web3/
● ETH NFT: https://ethereum.org/en/developers/tutorials/how-to-write-and-deploy-an-nft/
● Học Rust: https://www.youtube.com/watch?v=zF34dRivLOw
● Học Cadence: https://www.youtube.com/watch?v=iVevnipJbHo&list=PLvcQxi9WyGdF32YuZABVTx-t3-FsBNCN2
● Học TS, JS: https://www.youtube.com/watch?v=BwuLxPH8IDs
● Học Solidity: https://www.youtube.com/watch?v=ipwxYa-F1uY
https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p&index=1
● Học FE: https://fe-lang.org/docs/quickstart/first_contract.html
● Học WebXR JS: https://www.youtube.com/watch?v=AoFEZKg2Z-Y&list=PL8bmgwX9eBPGGOCQbGPw9VKWQfYyGZNPr&index=2
Kiến thức lập trình với kiến trúc blockchain qua sách vở chương bài
● Xem qua sách vở chương bài https://dathoc.net/skill (phần Blockchain)
● Xem ebook: https://dathoc.net/bookbc
● Xem json rpc for Ethereum: link here
● Xem json rpc for Solana: https://docs.solana.com/developing/clients/jsonrpc-api
● Support apis: https://ethereum.org/en/developers/docs/apis/backend/
● Binary tree test: https://www.geeksforgeeks.org/implementation-binary-search-tree-javascript/
● Doc dev for Ethereum: https://ethereum.org/en/developers/docs/ethereum-stack/
● Doc dev for Eth2: https://ethos.dev/beacon-chain/
https://arxiv.org/pdf/2110.12909.pdf
https://daejunpark.github.io/deposit.pdf
● Doc dev for Hyperledger Fabric: https://hyperledger-fabric.readthedocs.io/en/release-2.2/tutorials.html
● Doc dev for Flow: https://docs.onflow.org/fcl/tutorials/flow-app-quickstart
● Doc dev for Solana: https://docs.solana.com/cli/install-solana-cli-tools
https://docs.solana.com/cluster/overview
● Doc dev for Binance Smartchain: https://docs.binance.org/smart-chain/wallet/wallet_api.html
Build a sample smartcontract
//go to https://dashboard.alchemyapi.io/ to get new acct with Rinkeby testnet
//free Rinkeby ETH
https://faucets.chain.link/rinkeby
//view Rinkeby ETH
https://rinkeby.etherscan.io/address/0x74eef21e77b5b16e4ea64872eaabeb9bfe5d9c28
//via OpenZeppelin
https://docs.openzeppelin.com/learn/developing-smart-contracts
https://docs.openzeppelin.com/contracts/4.x/
//on Ethereum
https://ethereum.org/en/developers/tutorials/hello-world-smart-contract-fullstack/
//or try Hardhat https://hardhat.org/getting-started/
https://hardhat.org/tutorial/writing-and-compiling-contracts.html
//Fe first contract
https://fe-lang.org/docs/quickstart/first_contract.html
/ETH upgrade smartcontract https://www.youtube.com/watch?v=RoXgaAvoIjg
//on BSC
https://moralis.io/how-to-create-a-bsc-token-in-5-steps/
//on Flow
https://docs.onflow.org/dapp-development/smart-contracts/#gatsby-focus-wrapper
//on Hyperledger Fabric
https://hyperledger-fabric.readthedocs.io/en/release-2.2/smartcontract/smartcontract.html#developing
//on Solana
https://www.leewayhertz.com/build-solana-smart-contracts/
Build a Solidity sample blockchain assets & operate
// some assets
https://github.com/bkrem/awesome-solidity
// a retail bill
https://github.com/mrice/solidity-legal-contracts/blob/master/contracts/BillOfSale.sol
//trace an product
https://github.com/tanogedler/tracking-asset-with-solidity/blob/master/contracts/traceability.sol
//real estate - land property
//logistic shipment
https://github.com/ajb413/eth-shipment-tracking/blob/master/contracts/ShipmentTracking.sol
Build a Client-Server with NodeJS app
//study learn HTML & JavaScript
//Google w3school to learn
//study JS Bootstrap
https://www.w3schools.com/bootstrap4/
//test & config Bootstrap
https://getbootstrap.com/docs/4.0/getting-started/download/
[Build App] học Xây dựng ứng dụng với HTML JS, NodeJS
Ví dụ build một ứng dụng NodeJS
https://www.youtube.com/watch?v=Oe421EPjeBE
Ví dụ build NodeJS tích hợp authentication qua Google Firebase
https://www.youtube.com/watch?v=kX8by4eCyG4
Ví dụ GUI bootstrap web với NodeJS
https://www.youtube.com/watch?v=OUmML-_8QQA
Ví dụ tích hợp Web3.js, smartcontract với NodeJS
https://www.youtube.com/watch?v=KkZ6iYnSDRw&t=1081s
//get & build & test autotest_web_prj.zip project
unzip autotest_web_prj.zip
cd autotest_web_prj
npm i
npm start
//view to test: localhost:8075/aut
Work with ReactNative build Android/iOS app from BoilerPlate
//create mobile app from template BoilerPlate
//you should have nodejs installed: on Windows or Mac
//check https://nodejs.org/en/download/
//check to install ReactNative on Windows/ Mac/Linux
https://reactnative.dev/docs/environment-setup
//check you have Android SDK installed from Android Studio
https://developer.android.com/studio
//from Android Studio, install and download an Android emulator, read
https://developer.android.com/studio/run/managing-avds
//app will have name: MyApp
//follow https://thecodingmachine.github.io/react-native-boilerplate/docs/Installation
//or
npx react-native init MyApp --template @thecodingmachine/react-native-boilerplate
Smartcontract best practices
//Xem https://consensys.github.io/smart-contract-best-practices/development-recommendations/
Setup Ethereum envi & Dev with
//setup Metamask
//search Google “chrome metamask” to install
ETH1
//using testnet: Rinkerby, lets google it
//or using testnet: Ropsten, lets google it
//or, build your own testnet with geth & docker: https://geth.ethereum.org/docs/install-and-build/installing-geth
//get ETH free for testing in Rinkerby
//get free Ropsten ETH
https://faucet.dimensions.network/
ETH2
//try testnet Goërli Testnet https://mudit.blog/getting-started-goerli-testnet/
//try become an Eth2 Stake Validator https://launchpad.ethereum.org/en/overview
//try LIGHTHOUSE: https://lighthouse-book.sigmaprime.io/installation-binaries.html
//try to use Hardhat Evi + IDE https://hardhat.org/getting-started/
//or, remix solidity editor IDE
//smartcontract with FE-lang
https://fe-lang.org/docs/quickstart/first_contract.html
//sample contracts
https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts
//check Eth2 cli
https://ethereum.org/en/upgrades/get-involved/#clients
//try scale sidechain with Polygon
https://docs.polygon.technology/docs/develop/hardhat
Setup BSC envi & Dev with
BSC
//xem: https://docs.binance.org/smart-chain/wallet/wallet_api.html
//bep20: https://docs.binance.org/smart-chain/developer/BEP20.html
https://github.com/bnb-chain/bsc
//free bnb https://testnet.binance.org/faucet-smart
BC
//xem https://docs.binance.org/guides/node/install.html
//testnet https://docs.binance.org/guides/node/join-testnet.html
//cli: https://docs.binance.org/api-reference/cli.html
Setup Flow envi & Dev with
//tập tành smarcontract với web coding tương tác dễ hiểu:
https://play.onflow.org/local-project
https://play.onflow.org/local-project?type=tx&id=local-tx-temp-0&storage=none
//CLI
sh -ci "$(curl -fsSL https://storage.googleapis.com/flow-cli/install.sh)"
//add /home/kj/.local/bin to path
//create key
flow keys generate
//on testnet , creat an account: https://testnet-faucet-v2.onflow.org/
//setup VScode with FLO CLI
https://github.com/onflow/vscode-cadence
//build first app
https://docs.onflow.org/fcl/tutorials/flow-app-quickstart/#installation
//extend first app
https://www.youtube.com/watch?v=T2QTTFnQa5k&list=PLvcQxi9WyGdF32YuZABVTx-t3-FsBNCN2&index=3
//refer: integrate nodejs with flow; and nextjs with flow
https://github.com/onflow/fcl-js
//testnet: https://testnet-faucet-v2.onflow.org/
//refer: codes
https://codesandbox.io/examples/package/@onflow/fcl
Setup Solana envi & Dev with
//install tool suites: https://docs.solana.com/cli/install-solana-cli-tools
//xem https://docs.solana.com/wallet-guide/paper-wallet
//view testnet
//explorer: https://explorer.solana.com/?cluster=devnet
//token program: https://spl.solana.com/token
//tương tác dễ hiểu tạo smartcontract với JS to Rust
https://project-serum.github.io/anchor/tutorials/tutorial-0.html#clone-the-repo
//build break project
https://github.com/solana-labs/break
//build escrow project, and transfer token
https://github.com/paul-schaaf/solana-escrow
//refer: integrate js with solana
https://docs.solana.com/developing/clients/javascript-api#installation
Setup Hyperledger Fabric envi & Dev with
//xem https://hyperledger-fabric.readthedocs.io/en/release-2.2/test_network.html
//get main fab dockers
curl -sSL https://bit.ly/2ysbOFE | bash -s
//will resutls some docker images & fabric-samples folder
//create new envi
conda create -n hf python=3.8
conda activate hf
//setup prerequisite Hyperledger Fabric -hf
https://hyperledger-fabric.readthedocs.io/en/latest/prereqs.html
cd fabric-samples/test-network
//setup docker-compose 1.27.2
sudo apt-get remove docker-compose
sudo rm /usr/local/bin/docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
//setup node 14
curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
//cd to hf project folder, up/down testnetwork, create channel, start a chaincode (smartcontract), interact with network
//xem https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html#before-you-begin
//refer: deploy js basic app
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript -ccl javascript
//refer: practice peer cmd
//refer: integrate nodejs sdk with fabric 2.2
https://hyperledger.github.io/fabric-sdk-node/release-2.2/module-fabric-network.html
//refer: tranfer assets nodejs app with fabric
https://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.html
//monitor network
./monitordocker.sh net_test
//shutdown testnet
//list dockers
docker network ls
//inspect
docker network inspect net_test
//detach container from net_test
docker network disconnect -f net_test logspout
docker network prune
//luu y
https://hyperledger-fabric.readthedocs.io/en/latest/deploy_chaincode.html#package-the-smart-contract
Setup WebXR envi & Dev with
● Chrome browser installed latest version
● Test some Three.js cababilities:
○ https://threejs.org/docs/manual/en/introduction/How-to-create-VR-content.htm
● Enable WebVR in Chrome Browser:
○ Set enable webxr chrome flag: chrome://flags/#webxr
○ Install Chrome extension add-on: WebXR API Emulator, link here
● Debug on web:
○ Open chrome browser, enter https://dathoc.net/mm or examples on https://threejs.org, be sure on web, let’s start with https
○ Upload your codes/js scripts to server to view. Or enter three.js example for webxr, ex: WebXR / VR / dragging
○ Enable Chrome extension: WebXR API Emulator
○ View application, then enter VR on Chrome browser (if have)
○ To debug mode on browser, F12
○ View WebXR tab
○ Choose combox for device, then control pad and headset
Sample app authentication
//view project folder firebase_authen
Sample app digitalize documents
//view project folder doc_digi
Sample app logistic
//view project folder logistic
Sample app defi
//view project folder sample_nft, defi
Sample app root extraction
//view project folder root_extract
Sample app metaverse
//view project folder sample_metaverse
More on DeFi
DApp Ref
Chúng ta học LẬP TRÌNH ỨNG DỤNG NGHIỆP VỤ với network blockchain. Vậy 99% bàn luận sẽ về DAPP.
[Build DApp] part 1
Tưởng tượng thời XƯA, a em lập trình app .Net với C#, Spring với Java, thì:
- Ôi anh ơi, .NET, Spring nó làm hết cho ta rồi, tụi e chỉ việc dùng lại, import, from.... rồi CHẤM tìm và kiếm object thôi
- Ôi anh ơi, GUI nó cũng viết hết cho tụi em rồi. Kể cả desktop app, lẫn webapp, mà nhiều gui comp đẹp lắm
- Ôi anh ơi, khi e cần connect sock, hay database ngoài, ví dụ MSSQL, Posgres... có hết thư viện sẵn. Lại chỉ việc CHẤM rồi tìm kiếm, dùng thôi.
- Ôi anh ơi, build nhanh lắm
Vậy bây giờ DApp khác App xưa ra sao???
[Build DApp] part 2
DApp với các mạng blockchain, VÀI ĐIỂM LƯU Ý
Mỗi hệ/mạng blockchain CHẮC CHẮN PHẢI CÓ một PROTOCOL đặc thù để tương tác bên ngoài. Tức là những app bên ngoài muốn tương tác phải qua protocol đó. Cái APP bên ngoài tương tác blockchain ta gọi là DAPP.
Oh, vậy DAPP sao GIỐNG APP thường quá?. Vì App thường, nó cũng cần có protocol để kết nối database, third party
Không, khác đó.
- App Thường thì tương tác có thể centralize, hoặc distributed ... và những CÁI NÓ KẾT NỐI TỚI không phải là một decentralized system, VẬY,
- App Thường khi kết nối và tương tác với một decentralized system SUY RA ----> đó chính là DAPP
- Hiện tại blockchain là một decentralized system
- Thế trước kia chưa nổi blockchain; vẫn có dapp nhé. Ví dụ edonkey, emule, imesh... a em chuyên ĐAO NỐT film, file, crack phần mềm
[Build DApp] part 3
Vậy VẤN ĐỀ là giống như .NET hay Spring, DApp với mạng blockchain phải có thư viện sẵn để hỗ trợ dapp tương tác, điều hành thiết kế ứng dụng thôi. Đó là:
- Lưu ý mô hình 3-4 layer trong slide nêu rõ. Dapp thường là Layer 3.
- 99% blockchain sẽ là database dạng file i/o, số ít dùng db đặc biệt, query biến đổi tìm kiếm chủ yếu trên dạng cây nhị phân. Và có sẵn hàm biến buildin cho bạn từ web3, json rpc chọc vào. Xong đa phần ko chọc trực tiếp đc, phải qua layer smartcontract. Một số mạng đặc thù build sẵn tool đặc thù cho bạn cmd cli vào
- 95% các bạn muốn tương tác với lõi blockchain (block, transact, network activities...) phải qua smartcontract
- 100% các bạn muốn tạo các "tài sản số" phải qua smartcontract
- 70% mọi ng sẽ dùng Web3.js hoặc tích hợp luôn câu lệnh qua cmd cli, đa phần là ứng dụng web-based
- 30% dùng json rpc, đa phần là api, các dapp thường là mobile
- Đúng rồi, khi bạn xử lý một logic cần giao dịch, thì phải qua smartcontract; các việc còn lại, vào queue tạo block... rồi phân tán lên các node, layer 2 execution, tới layer 1, tới layer 0 blockchain sẽ tự xử lý, bạn ko cần lo
- Thế GUI của Dapp làm bằng gì: ôi vẫn html, js hay.... reactnative thôi; mọi ng xem setup để thực hành thêm
- Thế authentication?? đa phần ethereum là mở; và chỉ xác nhận địa chỉ kèm seed, và mọi ng có thể CHỌC và logic smartcontract của người khác. Vậy chỗ này chịu thôi. Vậy smartcontract dễ bị flood, scam hacking...Xong với các network blockchain private hoặc permissionless, sẽ có lớp nữa để bảo mật chỉ cho NHÓM người nào đó sử dụng thôi; ko public như các network khác.
- Thế ôi cái authentication qua ví metamask rủi ro quá?; vậy xác nhận 2 lần; lần1 qua firebase; lần 2 qua ví
- Thế tôi muốn connect database khác, làm các logic khó, lằng nhằng 3-4 thirdparty? không sao cả, anh em tạo hẳn backend riêng cho DApp, và logic nào cần tính toán nhiều, tính toán nặng, a e làm trên backend. Còn chỉ cần logic vào ra nhẹ nhàng thì... smartcontract
[Build DApp] part 4
Vậy VẤN ĐỀ smartcontract -sc ở các mạng blockchain nói chung
- Ai lập trình rồi, sử dụng hướng đối tượng, cũng đều hiểu class. Hãy nghĩ đơn giản smartcontract là class
- Vậy khi deploy class smartcontract A (sc A) lên mạng blockchain; nó có thể vận hành một số function hoặc activites; nó có thể gọi các class khác/ sc khác
- Khác class ở app thường; nó không thể thay đổi hoặc biến dị, hay override hàm. Chỉ có thể tạo mới hoặc wrap. Có nghĩa phải test kỹ sc trước khi deploy
- Về dev sc: các types, operations, buildins... xem sách dev, hoặc youtube
- Một số lib, hàm buildin trong quá trình dev sc khi tương tác với network blockchain
+ các api xem biến môi trường; các địa chỉ cần gọi
+ các api hỗ trợ dự báo chi phí tài nguyên tiêu tốn khi thực thi sc
+ các api hỗ trợ tìm kiếm; truy duyệt cây nhị phân tìm địa chỉ hoặc transaction; duyện trên block
+ các api hỗ trợ tạo event hoặc emit event khi cần notify khi dev với hàm/biến
+ các api hỗ trợ truy lỗi, log lỗi
+ các api hỗ trợ security sc khi i/o
[Build DApp] part 5
Vậy VẤN ĐỀ các tài sản trên blockchain. Tại sao nó đã có block và transaction rồi, và địa chỉ smartcontract. Giờ lại nêu tài sản số - blockchain assets là sao?
- Đúng rồi, vì blockchain là một network, nó có nhiều logic đặc thù. Vậy ngoài block, trans, network activities... rồi emit event qua sock giống app thường, nó sẽ có một TÁC VỤ khác là: cho smartcontract TẠO những TÀI SẢN ĐẶC THÙ cho một số nhiệm vụ phục vụ nghiệp vụ đặc thù, của logic đặc thù
- Ví dụ 1: tôi muốn tạo tài sản TIỀN SỐ - crypto, nhiệm vụ của nó là giúp tôi thay tiền VIỆT giao dịch những hàng hoá tôi cần ở thị trường; tôi muốn tạo mạng riêng X, tiền Y, có 2 triệu đơn vị, mệnh giá 1 Y= 10000 vnd, đơn giản bạn phải tạo 01 ASSET ghi trên đó số lượng, quyền hạn, người sở hữu, tính phân nhỏ, tính huỷ. Sau đó quy định phí giao dịch tương ứng với chi phí mạng blockchain đó khi giao dịch. Với Ethereum hiện đang tính bằng Gas với đơn giá ETH. Theo đó, 2 triệu đơn vị tài sản sẽ là 2 triệu địa chỉ cứng. Và đồng tiền Y thực chất là một mã hash nhị phân trên block, gắn với nhau gọi là chuỗi chain.
- Ví dụ 2: tôi muốn tạo tài sản SỐ HOÁ VĂN BẢN, KHẾ ƯỚC, DI CHÚC GIẤY. Tương tự như trên. Xong cần thêm mã hoá đặc trưng để phân biệt tài sản này với tài sản khác. Có thể qua chủ sở hữu. Định danh chủ sở hữu
- Ví dụ 3: tôi muốn tạo tài sản AVATAR 3D, NFT - là tài sản bất biến. Tương tự như trên. Xong bỏ thuộc tính phân nhỏ hơn, bỏ huỷ. Và phải tạo một CƠ CHẾ SCAN bề mặt tài sản, vì nếu là phim số 2 tiếng; ảnh số 8k; video music, hoặc audio music file 3 phút... cần CƠ CHẾ XÁC NHẬN nó là DUY NHẤT.
- Ví dụ 4: tôi muốn tạo tài sản số hoá định danh từ NHÀ CỬA, XE ÔTÔ; để sau này có thể giao dịch; sang nhượng quyền. Tương tự như trên.
- Ví dụ 5: tôi muốn tạo tài sản số là những VÉ VOUCHER vào VIỆN khám bệnh miễn phí, giảm phí; VÉ XEM PHIM. Tương tự như trên.
- Ví dụ 6: tôi muốn tạo tài sản số là NHỮNG QUYỀN ĐẶC BIỆT, như sang nhượng tiền crypto; sang nhượng các QUYỀN khác ở tài sản khác; cho phép xem hoặc sử dụng tài sản số NFT, hoặc XE ÔTÔ
.
.
.
[Build DApp] part 6
Vậy trong quá trình làm các DApp phục vụ các bài toán logic như:
Trích xuất nguồn gốc nông sản
Vận chuyển logistic
Số hoá văn bản, kế ước, di chúc
Mua bán NFT
Mua bán hàng hoá ảo trên Metaverse
Chúng ta cần tập trung và làm RÕ các logic:
- Logic nào cần đưa vào chain; logic nào cần ở backend; logic nào cần frontend; vì ko phải tất cả các hoạt động, các function, các giao dịch đều trỏ vào blockchain xử lý. Như thế sẽ tốn thời gian đồng thuận, hoặc tài nguyên để mining/staking. Blockchain không phải nơi xử lý mọi logic của nghiệp vụ
- Thiết kế database thế nào vừa cho xử lý nhanh backend; vừa tiện cho frontend; blockchain thì đã có kiểu dạng file đặc thù và cây nhị phân là database của nó rồi. Một số blockchain khác dùng thêm những db đặc biệt.
- Login nào cần truy vấn tìm kiếm nhanh; bộ đệm data truy vấn in-mem là tốt nhất;
- Logic nào cần BẤT BIẾN; logic nào cần bảo mật không thay đổi; mong muốn data truy cập mọi nơi
- Logic nào cần tương tác mua bán ETH để giao dịch
- Logic nào cần bên thứ 3 xử lý và cần lấy kết quả xử lý tiếp
- Logic nào cần emit ra notify các service ngoài; socket cần cầu nối sang các bên monitor, cảnh báo; hoặc lưu log file, thống kê báo cáo (filebeat & ELK)
DApp testnet debugging
[101 lỗi hay gặp khi programing/ dealing với smarcontract]
Nói chung cho... ETH, BSC, Solana, Flow, Hyperledger Fabric
👉Tất nhiên quy trình là:
- Bạn định tương tác với cái hàm gì trong class (smarcontract) bạn cần đủ gas
- Và biết thế nào là đủ gas thì phải estimate, web3js cho bạn đủ function để estimate khi xử lý hàm gì trong class
- Xong đó là estimate, bạn nên đưa thừa gas lên chút cũng ko bắt ai cả
- Xong chỉ chú ý trên testnet thôi nhé, realnet/mainnet thì tính toán kỹ các logic và gas
👉Quy chuẩn khi compile code class smartcontract
- Compile với latest package
- Để name hàm biến theo chuẩn
- Phạm vi biến, cái nào public để hạn chế nơi khác gọi. Cái nào cần tách private tính toán nội hàm, nơi khác ko gọi đc.
- Review hộ mình lên xuống logic có cần thiết cộng trừ nhân chía nhiều thế kia không
- Review hộ mình lên xuống Ai gọi cái hàm đó, và cho Ai
- Review hộ mình lên xuống class smartcontract có cần được gọi quá nhiều ở logic của app ko? tức là app chạy, cái gì cũng lôi smartcontract ra gọi. Có cần thiết thế ko?
- UnitTest rồi Deploy
👉Vì đa phần là mạng mở, nên class smarcontract luôn bị ddos, nên... đơn giản khoá nó trong một internal network là xong
👉Luôn gắn cái gì thay đổi BẢN GHI trên chain cần là một Owner. Khi đổi quyền chắc là NFT thôi. Còn xin lỗi ko có cái gì khác.
👉Contractname cần giống constructor, bản 0.8 Sol đã có
👉Lỗi bị tính toán quá nhiều gas mà... logic bạn chẳng có gì
Lưu ý, uint256 là khai báo tốn ít mem và gas nhất. Những cái còn lại có thể bạn chưa biết hoặc ...tiện tay nên cần chỉnh lại.
Thêm nữa càng nhiều tính toán, gas càng mất; càng string lưu càng dài, gas càng mất. Ví dụ game id kiểu 0x23423hdsfjwerwr... là toi rồi. Vậy đơn giản làm thêm bảng map trên In-Men redis để đối chiếu id lưu trong Chain so với ID game/app thực tế
👉Lỗi bị under price khi interact với function
Đa phần các testnet sẽ default reject bạn khi bạn lặp đi lặp lại một function quá nhỏ. Vậy có 2 cách.
Nếu thử nhiều lần: vậy qua localnet
Nếu thử 1-3 lần cần sign nghiêm chỉnh: testnet
Nếu bị under price; đơn giản tạo acct mới và deploy lại trên testnet
👉Lỗi bị already known khi interact với function
Đơn giản là bạn lặp đi lặp lại một cái gì đó giống nhau. Nên tránh, testnet ko thích điều này.
Nên làm chán trên local. Testnet chỉ verify lại thôi
👉Lỗi bị revert trong EVM
Cái này do class smartcontract của bạn vẫn giữ chỗ mem và chưa giải phóng ở thực thi một hàm nào đó. Điều này nguy hiểm khi đâu đó gọi dẫn tới sc bị cứng và ko xử lý tiếp đc các cuộc gọi khác. Hay nguyên nhân thường thấy là: bạn pay một chi phí ở một hàm mà nó không có payable. Hoặc bạn cố xử lý hàm mà bạn không có Quyền xử lý và nó đang cần pay.
Giải pháp là: Chèn payable, hoặc redeploy lại sc
Xem để fix: https://www.youtube.com/watch?v=RxL_1AfV7N4
👉Lỗi bị re-entry
Xử lý kèm với timelock cùng proposer và executer, với nhiều admin nhiều lần approve action đó rồi mới execute, trong một khoảng time; giảm thiểu rủi ro 1 phía tự xử lý khi acct bị hack/re-entry.
Xem: https://www.youtube.com/watch?v=W2k32FrAD1k&list=PLdJRkA9gCKOO5hxHbQCJHdHeaedlqBYTS&index=4
Nguyễn Quang Minh
Passionate developer and writer sharing insights about technology, programming, and digital innovation. Follow for more content about web development and tech trends.