วิวัฒนาการทางเทคนิค: สิ่งที่เปลี่ยนแปลงจริง ๆ
🔗 การนำทาง: 📋 INDEX | 📝 Diary Home | 🔍 การวิเคราะห์ | 📊 รายงาน
อ่านเพิ่มเติม: ความท้าทายและวิธีแก้ปัญหา | ความสำเร็จทางเทคนิค | ไทม์ไลน์การพัฒนา
การย้าย Stack
Hardhat → Foundry (Session 4-5)
ทำไม: การทดสอบ Hardhat ช้า, deployment scripts เทอะทะ
เมื่อไหร่: หลังจาก 45 commits, 3-4 มิถุนายน
ผลลัพธ์: การทดสอบเร็วขึ้น, เครื่องมือ deployment ดีขึ้น
Web3.js → Viem (Session 7-8)
ทำไม: Web3.js ดูล้าสมัย, การรองรับ TypeScript แย่
เมื่อไหร่: 5 มิถุนายน ระหว่างทำ frontend ครั้งแรก
ผลลัพธ์: โค้ดสะอาดขึ้น, developer experience ดีขึ้น
Sequential → Multicall3 (Session 9)
ทำไม: การโหลด NFT 210 ตัวใช้เวลา 30+ วินาที
เมื่อไหร่: 6 มิถุนายน การปรับปรุงประสิทธิภาพ
ผลลัพธ์: เวลาโหลดลดเหลือ 3 วินาที
การพัฒนา Contract
Version 1: ERC721 พื้นฐาน
contract CarbonCreditNFT is ERC721, Ownable {
mapping(uint256 => uint256) public carbonAmount;
}
ปัญหา: ไม่มีระบบ class, มี minting แบบ manual เท่านั้น
Version 2: เพิ่ม Classes
enum NFTClass { Standard, Platinum }
mapping(uint256 => NFTClass) public nftClass;
ปัญหา: ยังไม่มี batch operations
Version 3: ระบบ Production
function batchMintWithClass(
address[] memory recipients,
NFTClass class,
uint256 amount,
string memory unit
) external onlyOwner
ผลลัพธ์: เวอร์ชัน production ปัจจุบัน
วิวัฒนาการ Frontend
Phase 1: HTML + Web3.js พื้นฐาน
- หน้าเดียวสำหรับดู NFT
- เชื่อมต่อ wallet แบบ manual
- ไม่มีการจัดการ error
Phase 2: Modular Viem Integration
- สถาปัตยกรรมแบบ component-based
- แชร์ constants ระหว่างไฟล์
- ข้อความ error ที่ดีขึ้น
Phase 3: Production Interfaces
- 6 หน้า HTML ที่แตกต่างกัน
- CSS แบบ Glassmorphism
- การปรับปรุงด้วย Multicall3
- อัปเดตแบบ real-time
ประวัติการ Deploy
Local Only (Sessions 1-3)
- Hardhat local network
- ทดสอบแบบ manual
First Testnet (Session 6)
- Deploy บน Sichang chain
- Contract verification ทำงานได้
Multi-Chain (Sessions 11-12)
- เพิ่ม JIBCHAIN L1
- ได้ addresses แบบ deterministic
- Contract เดียวกันบนทั้งสอง networks
ข้อมูล Performance
ก่อน Multicall3
- 210 RPC calls แบบต่อเนื่อง
- เวลาโหลด 30+ วินาที
- user experience แย่
หลัง Multicall3
- 21 batched calls
- เวลาโหลด 3 วินาที
- พร้อมสำหรับ production
การประหยัด Gas
Contract ตอนแรก
- Individual minting: ~50k gas
- ไม่มี batch operations
Contract ปัจจุบัน
- Batch minting: ~45k gas ต่อ NFT
- Manager contract จัดการการแจกจ่าย
การตัดสินใจทางเทคนิคที่สำคัญ
สถาปัตยกรรม Smart Contract
- NFT ทั้งหมด mint ไปที่ manager contract
- ระบบสองระดับ: Standard (1 tCO2), Platinum (10 tCO2)
- การสร้าง SVG on-chain
กลยุทธ์ Multi-Chain
- Addresses เหมือนกันผ่าน nonce synchronization
- ลำดับ deployment เดียวกันบนทุก networks
- การตั้งค่า RPC ที่สอดคล้องกัน
Frontend Performance
- Multicall3 สำหรับทุก batch reads
- การใช้ component ซ้ำระหว่าง interfaces
- การ caching ที่จริงจังเท่าที่เป็นไปได้
สิ่งที่ใช้ไม่ได้ผล
Template Literals ใน HTML
<!-- สิ่งนี้ใช้ไม่ได้ -->
<p>Contract: ${CONTRACT_ADDRESS}</p>
แก้ไข: ใช้ addresses จริงใน HTML, template literals ใน JS เท่านั้น
Display Limits ที่ hardcode
// นี่ผิด
const loadCount = Math.min(totalSupply, 20);
แก้ไข: แสดง tokens ทั้งหมดเสมอหรือทำ paginate ให้ถูกต้อง
RPC URLs ที่ปนกัน
- ใช้ทั้ง localhost และ white.local แก้ไข: มาตรฐานที่ localhost:8545
Deployment Timeouts
- Batch mints ขนาดใหญ่จะ timeout แก้ไข: ทำให้เสร็จแบบ manual ด้วย cast commands
สถาปัตยกรรมปัจจุบัน
Smart Contracts
- NimmanCarbonPass: ERC721 หลักพร้อมฟีเจอร์ carbon
- NimmanNFTManagerSimple: การจัดการ batch transfer
- UniservLogoStorageDynamic: การเก็บ SVG on-chain
Frontend Stack
- Vanilla HTML/JS พร้อม ES modules
- Viem สำหรับ Web3 interactions
- สถาปัตยกรรม shared component
- Multicall3 สำหรับ performance
Networks
- Sichang: Chain ID 700011, testnet หลัก
- JIBCHAIN L1: Chain ID 8899, testnet รอง
- Anvil: การพัฒนาและทดสอบ local
บทเรียนที่นำไปใช้
- ใช้เครื่องมือที่ทันสมัย: Foundry > Hardhat, Viem > Web3.js
- ปรับปรุงตั้งแต่เนิ่น ๆ: ใส่ Multicall3 ตั้งแต่เริ่มต้น
- ทำให้เป็นมาตรฐานทุกอย่าง: RPC URLs, contract addresses
- บันทึกการตัดสินใจ: ทำไมถึงเลือกแบบนั้น
- ทดสอบอย่างละเอียด: ทุกฟังก์ชัน, ทุก networks