บทความนี้จะเล่าเกี่ยวกับชุดข้อมูลพื้นฐานของ Internet Computer พร้อมคำจำกัดความของ “Principal” และ “Identity” เพื่อจัดการแอปฯ ที่ปรับใช้บน Internet Computer
เกี่ยวกับบทความนี้
ในบทความนี้จะมีการอธิบายแนวคิดสำคัญที่นักพัฒนาจำเป็นต้องรู้เพื่อเริ่มมีส่วนร่วมกับ Internet Computer และสร้างแอปฯ อย่างง่าย ๆ
โดยจะมีการยกตัวอย่างที่เข้าใจง่าย ถ้าหากคุณมีพื้นฐานในการสร้างเว็บแอปพลิเคชันอยู่แล้ว หรือรู้ภาษาโปรแกรมอย่างน้อยหนึ่งภาษา และโต้ตอบกับคอมพิวเตอร์ของคุณด้วยคำสั่งได้อย่างสบายใจ
มาเริ่มทำความคุ้นเคยกับแนวคิดหลักในการจัดการแอปฯ ที่นำไปใช้กับ Internet Computer กันดีกว่า!
Internet Computer (ICP) คืออะไร?
Internet Computer (ICP) คือแพลตฟอร์มรูปแบบใหม่สำหรับสร้างแอปฯ อินเทอร์เน็ตที่มีคุณสมบัติของผู้ให้บริการระบบคลาวด์ เช่น AWS เข้ากับบล็อกเชนแบบกระจายศูนย์ เช่น Ethereum หรือ Solana โดย Internet Computer เหมาะอย่างยิ่งสำหรับการใช้งาน 3 กรณี ดังนี้
- ทำให้เว็บ/แอปมือถือมีความโปร่งใส ยืดหยุ่น และผ่านการเซ็นเซอร์มากขึ้น
- เร่งความเร็วแอปฯ บล็อกเชน เช่น Tokens, NFTs, DeFi เพื่อให้ทำงานที่ความเร็วระดับเว็บ เร็วขึ้นหลายร้อยหรือหลายพันเท่า และราคาถูกกว่าบล็อกเชน Ethereum
- รวมแอปฯ ทั้งสองแบบไว้ในแพ็คเดียวที่ช่วยให้นักพัฒนาสามารถเสนอบริการประเภทใหม่ เช่น NFT รุ่นต่อไปและการกำกับดูแลที่เปิดกว้างมากขึ้น
ในขั้นของการใช้งาน Internet Computer คือเครือข่ายของศูนย์ข้อมูลแบบกระจาย (โหนด) ทั่วโลกที่รันโค้ดแอปพลิเคชันและจัดเก็บข้อมูล โดยทำงานเป็นโปรโตคอล ซึ่งหมายความว่าเครือข่ายของโหนดเปิดอยู่ ดังนั้น ใครก็สามารถเข้าเข้าร่วมเพื่อเพิ่มความสามารถในการคำนวณและรับค่าธรรมเนียมก๊าซเป็นการตอบแทนได้
แอปฯ ของ Internet Computer ประกอบด้วยส่วนประกอบง่าย ๆ ที่เรียกว่าสัญญาอัจฉริยะแบบ canister โดยคุณสามารถมองว่า canister เป็นสิ่งที่คล้ายกับวัตถุจากการเขียนโปรแกรมเชิงวัตถุ ที่รวมทั้งรหัสและข้อมูลและสามารถสื่อสารกับโลกภายนอก: ผู้ใช้ บริการเครือข่าย และ canister อื่น ๆ
“Principal” คืออะไร?
“Principal” คือบุคคลที่สามารถโต้ตอบกับระบบคอมพิวเตอร์และสามารถระบุตัวตนเพื่อจุดประสงค์นี้ โดย Internet Computer มี Principal อยู่ 2 ประเภท ได้แก่
- ผู้ใช้ สามารถโต้ตอบกับ Internet Computer โดยการปรับใช้ canister ย้ายโทเค็น ICP จากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง หรือการเรียกใช้ canister methods
- Canister สามารถดำเนินการในแบบเดียวกันโดยทางโปรแกรม
โดยส่วนใหญ่แล้วเมื่อเราพูดถึง Principal เราจะหมายถึง “Principal id” ซึ่งเป็นตัวระบุเฉพาะที่กำหนดให้กับ Principal และสามารถใช้เพื่อระบุทรัพยากรที่ผู้ใช้หรือ Canister สามารถเข้าถึงได้ โดยในเอกสารและเครื่องมือของ Internet Computer เราจะใช้ “principal” และ “principal id” สลับกันได้
และนี้คือตัวอย่างการแสดงข้อความของ Principal id:
% dfx identity get-principal
nfxu4-cn7qt-x7r3c-5dhnk-dcrct-gmgoz-67gcg-5glvc-2krhv-gcmsr-qqe
Principals จะคล้ายกับคีย์ SSH สาธารณะ ตัวอย่างเช่น เราเพิ่มคีย์ SSH สาธารณะลงใน GitHub เพื่อให้สามารถเข้าถึงพื้นที่เก็บข้อมูลส่วนตัวได้ ในทำนองเดียวกัน เราต้องลงทะเบียนตัวการของคุณกับบริการที่คุณวางแผนจะโต้ตอบด้วยในอนาคต Principals (เช่น คีย์ SSH สาธารณะ) ไม่ได้เป็นความลับ ดังนั้น คุณจึงสามารถแชร์กับใครก็ได้เมื่อจำเป็น
คุณสมบัติทั่วไปของ Principals และคีย์ SSH สาธารณะ:
- They are not secret ไม่เป็นความลับ
- จำเป็นต้องลงทะเบียนกับบริการที่คุณต้องการเข้าถึง
- ต้องมีรหัสลับเพิ่มเติมในการตรวจสอบสิทธิ์ (แต่ไม่ต้องกังวล — คุณได้สร้างรหัสลับไว้แล้วโดยอัตโนมัติ)
แล้วทำไมเราถึงต้องการ Principal?
ในฐานะนักพัฒนา เราต้องมี Principal เพื่อระบุตัวเองต่อ Internet Computer เพื่อทำหน้าที่ต่อไปนี้:
- ปรับใช้ Canister (เหมือนกับการปรับใช้ dapps หรือสัญญาอัจฉริยะ)
- โต้ตอบกับ Canister ที่ใช้งานอยู่แล้ว เช่น โดยการเรียกเมธอด canister method
- จัดการ Canister เช่น หยุดหรือเปลี่ยนพารามิเตอร์ และจัดการการชำระเงินโฮสติ้ง (ดูบทความถัดไปใน Cycle Wallets)
Canister ใช้ Principal เพื่อให้แน่ใจว่าการดำเนินการแต่ละครั้งจะดำเนินการโดยผู้ใช้ที่ได้รับอนุญาตเท่านั้น ตัวอย่างเช่น ผู้ใช้จำเป็นต้องระบุตัวเองว่าเป็น Principal เฉพาะเพื่อให้สามารถปรับใช้ Canister ด้วยรหัสที่อัปเดตอีกครั้ง หรือย้ายยอดการชำระเงินของ Canister ไปยังกระเป๋าเงินอื่น
Internet Identity ยังใช้ Principal ในเบื้องหลังเพื่อระบุตัวคุณต่อ DApps ที่ต้องพบปะกับผู้ใช้ต่าง ๆ อย่างไรก็ตาม ในกรณีนี้ เราแทบจะไม่ได้เห็น Principal ของเราโดยตรงเลย
จะได้รับ Principal ปัจจุบันได้อย่างไร?
โดยส่วนใหญ่ คุณจะโต้ตอบกับ Principal ในระหว่างการพัฒนา IC dapps บนเครื่องพัฒนาของคุณ คุณสามารถรับ Principal ปัจจุบันได้โดยพิมพ์คำสั่งนี้ลงในคอนโซล:
% dfx identity get-principal
nfxu4-cn7qt-x7r3c-5dhnk-dcrct-gmgoz-67gcg-5glvc-2krhv-gcmsr-qqe
โปรดทราบว่าเราต้องติดตั้งและรันคำสั่ง dfx ก่อนจึงจะเห็น Principal ของเรา
“identity” คืออะไร?
เนื่องจาก Principal ของผู้ใช้คือการแสดงข้อความของคีย์สาธารณะของคู่คีย์เข้ารหัสลับแบบอสมมาตร Principal ของผู้ใช้แต่ละคนจึงมีคีย์ส่วนตัวที่เกี่ยวข้องกัน คีย์ทั้งสองถูกจัดเก็บเป็นวัตถุที่เรียกว่า “ข้อมูลประจำตัว” คุณสามารถติดตั้งข้อมูลระบุตัวตนหลายรายการบนเครื่องของคุณได้ และข้อมูลระบุตัวตนแต่ละรายการจะมีชื่อ
แม้ว่าชื่อจะคล้ายกัน แต่คำสั่งอย่าง Identities จะแตกต่างจากข้อมูลประจำตัวของเว็บที่สร้างผ่านบริการ Internet Identity
Identity จะถูกจัดเก็บไว้ในไดเร็กทอรีผู้ใช้ของเราที่ ~/.config/dfx/identity/<identity_name>/identity.pem แอปฯ คำสั่งจะใช้ไฟล์ .pem เพื่อยืนยันตัวตนของเราต่อบริการต่าง ๆ กระบวนการนี้คล้ายกับการเข้าถึงเซิร์ฟเวอร์ SSH ซึ่งคุณต้องใช้คีย์ SSH ส่วนตัวเพื่อพิสูจน์ Identity ของเราและเข้าถึงเซิร์ฟเวอร์ที่คุณเพิ่มคีย์สาธารณะไว้ก่อนหน้านี้
หากสูญเสียไฟล์ข้อมูลประจำตัว (เช่น การทำคอมพิวเตอร์สูญหาย) ผู้ใช้จะไม่สามารถระบุตัวเองว่าเป็นผู้ดำเนินการรายนี้ได้อีกต่อไป
ไฟล์ Identity .pem เป็นความลับสูง ไม่ควรแบ่งปันข้อมูลเหล่านี้กับใครเลย
โดยค่าเริ่มต้น identity ใหม่จะถูกสร้างขึ้นเมื่อคุณเรียกใช้ dfx บนเครื่องใหม่เป็นครั้งแรก identity นี้เรียกว่า ” identity เริ่มต้น” และจะถูกใช้สำหรับการโต้ตอบของ IC ทั้งหมดตามค่าเริ่มต้น เว้นแต่คุณจะเลือกข้อมูลอื่นด้วยตนเอง
คุณยังสามารถคัดลอก identity ของคุณจากคอมพิวเตอร์เครื่องเก่าที่คุณสร้างไว้ได้ เนื่องจากคุณสามารถคัดลอกคีย์ SSH ของคุณได้
จะจัดการข้อมูลประจำตัวหลายรายการได้อย่างไร?
คุณสามารถติดตั้งข้อมูล identity ได้หลายรายการในเครื่องเดียวกัน หากต้องการสร้าง identity ใหม่ คุณสามารถเรียกใช้ dfx identity new <identity_name> ได้ ตัวอย่างเช่น คุณสามารถเรียกใช้คำสั่งนี้เพื่อสร้างชื่อ identity ใหม่ “new_identity”:
% dfx identity new new_identity
สร้าง identity: “new_identity”.
identity ที่ถูกสร้าง: “new_identity”.
หากต้องการสลับ identity สามารถใช้ผู้ใช้ identity dfx <identity_name>:
% dfx identity use new_identity
ใช้ identity: “new_identity”.
หากต้องการทราบว่าจะใช้ Principal ใดในขณะนี้ สามารถใช้ dfx identity whoami:
% dfx identity whoami
new_identity
หากต้องการรับรายการ identity ทั้งหมด สามารถใช้คำสั่ง dfx identity list:
% dfx identity list
anonymous
default
new_identity *
การคัดลอกข้อมูลประจำตัวระหว่างเครื่องทำอย่างไร?
อย่างที่ได้กล่าวไว้ก่อนหน้านี้ เราสามารถคัดลอกข้อมูลประจำตัวของเราระหว่างเครื่องต่าง ๆ ได้เพื่อหลีกเลี่ยงการลงทะเบียน Principal หลายคนกับบริการของเรา โดยกระบวนการนี้คล้ายกับการคัดลอกคีย์ SSH ระหว่างคอมพิวเตอร์
ในการเริ่มต้น เราจะต้องคัดลอกไฟล์ .pem ข้อมูลระบุตัวตนของคุณจากคอมพิวเตอร์เครื่องเดิมที่ไฟล์ถูกสร้างขึ้น ไฟล์ .pem สำหรับแต่ละเอกลักษณ์จะถูกเก็บไว้ที่ ~/.config/dfx/identity/<identity_name>/identity.pem
สมมติว่าเราคัดลอกไฟล์ ident.pem จากคอมพิวเตอร์เครื่องเก่าไปยัง ~/import/identity.pem บนเครื่องใหม่ จากนั้นเราสามารถเรียกใช้คำสั่งนี้เพื่อนำเข้าไฟล์นี้เพื่อให้ได้รับการยอมรับว่าเป็นหนึ่งในข้อมูลประจำตัวบนคอมพิวเตอร์เครื่องนี้:
% dfx identity import old_identity ~/import/identity.pem
การสร้าง identity: “old_identity”.
identity ที่ถูกสร้าง: “old_identity”.
จากนั้นเราจะสามารถใช้งาน identity ที่นำเข้ามาโดยการเรียกใช้:
% dfx identity use old_identity
ใช้ identity: “old_identity”.
วิธีตั้ง Principal ให้เป็นตัวควบคุม Canister
เมื่อคุณปรับใช้ canister คุณต้องแน่ใจว่า Principal ปัจจุบันของคุณได้รับการตั้งค่าเป็นตัวควบคุม canister ผู้ควบคุมคือผู้หลักที่สามารถจัดการกระป๋องได้ เช่น:
- Deploy and update the canister ปรับใช้และอัปเดต canister
- ควบคุมวงจรในกระเป๋าเงินของ canister (เพื่อชำระค่าคำนวณและจัดเก็บข้อมูล)
เมื่อต้องการแสดง Pricipal สำหรับหนึ่งใน canister คุณสามารถเรียกใช้สถานะ canister dfx <canister_name> ตัวอย่างเช่น:
% dfx canister status hello
Canister status call result for hello.
Status: Running
Controllers: nfxu4-cn7qt-x7r3c-5dhnk-dcrct-gmgoz-67gcg-5glvc-2krhv-gcmsr-qqe
Memory allocation: 0
Compute allocation: 0
Freezing threshold: 2_592_000
Memory Size: Nat(363948)
Balance: 4_000_000_000_000 Cycles
Module hash: 0xfa16da03d37cffe89382b29db2077de1229841ea31b91b8c040b740317390cb7:
หากต้องการตั้งค่า identity รายการใดรายการหนึ่งเป็นตัวควบคุม เราสามารถใช้ dfx canister update-settings <canister_name> –controller <identity_name_or_principal_id> ตัวอย่างเช่น:
% dfx canister update-settings hello –controller old_identity
ตั้งค่าตัวควบคุมของ “hello” เป็น: old_identity
สรุป
Principals คือตัวแทนข้อความของกุญแจสาธารณะ (Public Key) ที่ระบุ Canister และตัวผู้ใช้ โดยผู้ใช้หลักแต่ละคนจะได้เป็นส่วนหนึ่งของข้อมูลประจำตัว คู่ของกุญแจสาธารณะ (Prrincipal) และรหัสลับ
Identities are stored on your machine in the ~/.config/dfx/identity folder.
There are a few commands that you need to know to manage identities:
- dfx identity import – to copy identities between machines and import them
- dfx identity new – to create a new identity
- dfx identity use – to switch between identities
- dfx identity whoami- to check which identity is currently used
Source: DFINITY