Announcement เปลี่ยนจากตรงนี้

January 26, 2024
บทความ

<strong>Internet Computer ทำความรู้จักพื้นฐานของอินเตอร์เน็ตบนโลกบล็อกเชน</strong>

บทความนี้จะเล่าเกี่ยวกับชุดข้อมูลพื้นฐานของ Internet Computer พร้อมคำจำกัดความของ "Principal" และ "Identity" เพื่อจัดการแอปฯ ที่ปรับใช้บน Internet Computer

เกี่ยวกับบทความนี้

ในบทความนี้จะมีการอธิบายแนวคิดสำคัญที่นักพัฒนาจำเป็นต้องรู้เพื่อเริ่มมีส่วนร่วมกับ Internet Computer และสร้างแอปฯ อย่างง่าย ๆ

โดยจะมีการยกตัวอย่างที่เข้าใจง่าย ถ้าหากคุณมีพื้นฐานในการสร้างเว็บแอปพลิเคชันอยู่แล้ว หรือรู้ภาษาโปรแกรมอย่างน้อยหนึ่งภาษา และโต้ตอบกับคอมพิวเตอร์ของคุณด้วยคำสั่งได้อย่างสบายใจ

มาเริ่มทำความคุ้นเคยกับแนวคิดหลักในการจัดการแอปฯ ที่นำไปใช้กับ Internet Computer กันดีกว่า!

Internet Computer (ICP) คืออะไร?

Internet Computer (ICP) คือแพลตฟอร์มรูปแบบใหม่สำหรับสร้างแอปฯ อินเทอร์เน็ตที่มีคุณสมบัติของผู้ให้บริการระบบคลาวด์ เช่น AWS เข้ากับบล็อกเชนแบบกระจายศูนย์ เช่น Ethereum หรือ Solana โดย Internet Computer เหมาะอย่างยิ่งสำหรับการใช้งาน 3 กรณี ดังนี้

  1. ทำให้เว็บ/แอปมือถือมีความโปร่งใส ยืดหยุ่น และผ่านการเซ็นเซอร์มากขึ้น
  2. เร่งความเร็วแอปฯ บล็อกเชน เช่น Tokens, NFTs, DeFi เพื่อให้ทำงานที่ความเร็วระดับเว็บ เร็วขึ้นหลายร้อยหรือหลายพันเท่า และราคาถูกกว่าบล็อกเชน Ethereum
  3. รวมแอปฯ ทั้งสองแบบไว้ในแพ็คเดียวที่ช่วยให้นักพัฒนาสามารถเสนอบริการประเภทใหม่ เช่น 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

บทความที่คุณอาจสนใจ