Saya meluangkan masa minggu lepas cuba memahami bagaimana domain .night sebenarnya berfungsi. Bukan daripada helaian spesifikasi, tetapi dengan membina sesuatu yang menyentuh rantaian secara langsung. Hasilnya ialah satu paparan profil ringkas. Anda taip nama seperti tomin.night, dan ia menyelesaikan profil tersebut terus daripada blockchain. Tiada API pendaftar. Tiada dinding pengesahan. Hanya kontrak pintar dan sedikit JavaScript.

Apa yang menyusul adalah cara ia berfungsi, apa yang saya pelajari, dan dua perangkap khusus yang membuang masa petang saya.

Mengapa Nama On-Chain Penting

Di Midnight, domain .night diuruskan oleh Midnames. Daripada membuat pertanyaan kepada pelayan pusat sesebuah syarikat, anda membaca terus daripada kontrak pintar yang berada di atas rantaian. Registry itu sendiri memegang domain, pemilik, dan apa jua medan profil yang disertakan oleh pemilik. Oleh kerana data tersebut berada di atas rantaian, identiti tersebut adalah mudah alih. Anda tidak menyewanya daripada platform yang boleh mengubah terma atau menghentikan perkhidmatan secara tiba-tiba. Jika anda mengawal kunci, anda mengawal nama tersebut.

Peralihan itu juga penting bagi pembangun. Apabila anda membina aplikasi berasaskan sistem DNS tradisional, anda perlu berurusan dengan had kadar, kunci API, dan janji masa aktif. Di sini, keadaan kontrak adalah sumber kebenaran. Aplikasi anda membacanya dengan cara yang sama seperti aplikasi lain membacanya. Tiada peringkat API istimewa.

Kodnya Hampir Terlalu Mudah

@midnames/sdk mengendalikan kerja berat. Menyelesaikan domain kepada alamat dan profil hanya memerlukan tepat dua baris:

const provider = createDefaultProvider({ networkId: "mainnet" });
const result = await resolveDomain(provider, "tomin.night");

Itu sahaja. Provider menyasarkan rangkaian, dan resolver berkomunikasi dengan kontrak. SDK mengembalikan objek hasil yang menyertakan penanda kejayaan. Jika domain tidak wujud, anda tidak memerlukan lapisan pengendalian ralat atau blok try-catch di sekeliling kegagalan RPC. SDK memberitahu anda dengan jelas bahawa tiada apa-apa di sana. Ini menjadikan pembinaan UI sangat menyenangkan. Anda boleh membuat cawangan berdasarkan penanda kejayaan dan menunjukkan keadaan "tidak ditemui" tanpa perlu meneka sama ada kegagalan itu disebabkan oleh nama yang hilang atau nod yang mati.

Apa Yang Anda Perolehi

Apabila carian berjaya, payload mengandungi dua bahagian penting.

Target ialah alamat dompet yang dituju oleh domain tersebut. Ini adalah utiliti terasnya. Ia menukarkan alamat hex yang panjang kepada sesuatu yang boleh dibaca, ditaip, dan diingati oleh manusia.

Fields memegang butiran profil. Apa jua yang disertakan oleh pemilik pada domain tersebut—pautan sosial, avatar, rekod teks—berada di dalam struktur ini. Medan-medan ini tidak disimpan pada kluster MongoDB sesebuah syarikat. Ia adalah medan dalam keadaan kontrak, yang bermaksud mana-mana aplikasi yang tahu cara membaca registry boleh memaparkan profil yang sama. Tiada penyinkronan pangkalan data diperlukan.

Dua Perangkap Yang Melambatkan Saya

Bukan semua tentang pembinaan ini hanya melibatkan dua baris dan penanda kejayaan. Saya menghadapi dua halangan khusus yang berbaloi untuk dijelaskan supaya anda tidak mengulanginya.

Ketidakpadanan Rangkaian

SDK menyokong persekitaran mainnet dan preprod. Saya menghabiskan masa yang agak lama menyahpepijat domain yang "tidak wujud." Namanya betul. Kodnya nampak betul. Provider sedang berjalan. Masalahnya ialah skrip saya membuat pertanyaan pada preprod manakala domain itu sendiri didaftarkan pada mainnet. Ralat tersebut kelihatan seperti domain yang hilang, tetapi sebenarnya ia adalah kekurangan konteks rangkaian.

Jika anda sedang menyelesaikan nama dan mendapat kegagalan, periksa tetapan provider sebelum anda menyahpepijat perkara lain. Pastikan networkId anda sepadan dengan rangkaian di mana domain tersebut sebenarnya dicetak. Ini adalah jenis kesilapan yang nampak jelas selepas kejadian, tetapi sangat sukar untuk dikesan apabila anda menganggap logik kontrak adalah puncanya.

Kesukaran Penserialan

Data yang dikembalikan daripada SDK bukanlah JavaScript standard. Ia mengandungi nilai BigInt dan objek Map. Jika anda cuba menghantarnya terus ke dalam JSON.stringify untuk dihantar ke pelayar, ia akan mencetuskan ralat atau menjatuhkan data secara senyap. BigInt tidak mempunyai representasi JSON asli, dan Map tidak diserialkan dengan cara objek biasa.

Saya akhirnya menulis penserial tersuai. Ia menelusuri objek hasil, menukar nilai BigInt kepada string, dan mengubah instans Map kepada objek biasa sebelum respons meninggalkan pelayan. Jika anda membina API yang menyediakan data Midnight kepada frontend, rancang langkah ini lebih awal. Jangan anggap output SDK sedia untuk digunakan oleh frontend hanya kerana ia adalah JavaScript.

Seni Bina

Saya sengaja mengekalkan stack yang ringkas. Backend adalah pelayan Node yang menjalankan Express. Ia mengimport @midnames/sdk, menjalankan logik resolusi, mengendalikan kerumitan penserialan, dan menyediakan JSON yang bersih. Frontend pula hanyalah HTML biasa dan vanilla JavaScript. Tiada langkah binaan. Tiada rangka kerja. Tiada penyesuai dompet.

Saya memilih untuk menjalankan SDK pada bahagian backend berbanding pelayar atas beberapa sebab praktikal. Ia memastikan sebarang konfigurasi pembekal tidak berada pada klien, ia memberi saya satu tempat untuk membetulkan kekusutan penserialan, dan ia bermakna frontend hanya perlu mengambil data dan memaparkannya.

Inilah bahagian yang paling mengejutkan saya: menyelesaikan nama adalah operasi bacaan awam. Anda tidak memerlukan sambungan dompet. Anda tidak memerlukan tandatangan. Anda tidak memerlukan pengguna untuk log masuk dengan apa-apa pun. Jika domain itu wujud, keadaan kontrak boleh dilihat oleh sesiapa sahaja yang meminta. Itu adalah perbezaan yang ketara daripada aliran web3 tipikal di mana setiap interaksi bermula dengan “sambung dompet.” Membaca identiti pada Midnight adalah tanpa kebenaran (permissionless) sama seperti membaca laman web awam yang juga tanpa kebenaran.

Pengajaran Sebenar

Membina paparan ini mengingatkan saya bahawa bahagian paling sukar dalam pembangunan blockchain jarang sekali melibatkan blockchain itu sendiri. Midnight telah pun menyelesaikan masalah yang sukar: membolehkan orang ramai memiliki nama dan profil mereka tanpa pangkalan data pusat. Bahagian yang sukar, dari perspektif pembangun, adalah mengingati rangkaian mana yang saya tujukan dan menulis fungsi pembantu untuk membersihkan jenis data.

Protokol ini memberikan anda identiti mudah alih. Tugas anda sebagai pembangun hanyalah untuk membacanya dengan betul dan tidak mengganggu pengguna. Kekalkan seni bina yang ringkas, asingkan logik yang berhadapan dengan rantaian daripada UI, dan anggap bacaan awam seperti apa adanya: pertanyaan pangkalan data biasa yang kebetulan berada pada lejar teragih.

Jika anda ingin melihat kod tersebut atau menjalankannya sendiri, sumber penuh tersedia di https://github.com/tomiin/midnames-profile-viewer.