การกู้คืนสคริปต์ที่ยอดเยี่ยม: Bitcoin ก้าวไปข้างหน้า

ผู้เขียนต้นฉบับ : SHINOBI

รวบรวมต้นฉบับ: บล็อกยูนิคอร์น

伟大的脚本恢复:比特币的前进之路

แม้จะมีขอบเขตของข้อเสนอ แต่อะไรคือเหตุผลว่าทําไม "การกู้คืนสคริปต์ที่ยอดเยี่ยม" ของ Rusty Russell อาจเป็นหนทางข้างหน้าสําหรับการพัฒนาของ Bitcoin?

บล็อกยูนิคอร์นหมายเหตุ: Rusty Russell เป็นนักพัฒนาที่กระตือรือร้นในชุมชน Bitcoin และได้รับการยอมรับอย่างมากในชุมชน เขาได้ทํางานอย่างกว้างขวางในการพัฒนาเคอร์เนล Linux และมีส่วนร่วมในโครงการพัฒนาหลักของ Bitcoin ที่ยาวนานมากมาย

เดิมที Bitcoin ได้รับการออกแบบให้มีภาษาสคริปต์ที่สมบูรณ์ซึ่งออกแบบมาเพื่อครอบคลุมและรองรับกรณีการใช้งานด้านความปลอดภัยที่อาจเกิดขึ้นซึ่งผู้ใช้อาจเกิดขึ้นในอนาคต ดังที่ Satoshi Nakamoto พูดก่อนที่เขาจะหายตัวไป:

"สาระสําคัญของ Bitcoin คือเมื่อเวอร์ชัน 0.1 ถูกปล่อยออกมาการออกแบบหลักจะถูกกําหนดสําหรับวงจรชีวิตที่เหลือ ดังนั้นฉันจึงต้องการออกแบบเพื่อรองรับการซื้อขายทุกประเภทที่เป็นไปได้ที่ฉันคิดได้ ปัญหาคือทุกอย่างต้องการรหัสสนับสนุนพิเศษและฟิลด์ข้อมูลไม่ว่าจะใช้หรือไม่ก็ตามซึ่งนําไปสู่กรณีพิเศษที่ยาวที่สุด โซลูชันนี้เป็นสคริปต์ที่สรุปปัญหาเพื่อให้ทั้งสองฝ่ายสามารถอธิบายธุรกรรมของตนด้วยเงื่อนไขเฉพาะที่เครือข่าย Node ประเมินหรือตรวจสอบตามเงื่อนไขเหล่านั้น" - Satoshi Nakamoto, 17 มิถุนายน 2010

จุดประสงค์ทั้งหมดของเขาคือการให้ภาษาแก่ผู้ใช้ซึ่งเป็นเรื่องปกติเพียงพอสําหรับพวกเขาในการจัดระเบียบประเภทของธุรกรรมตามที่พวกเขาต้องการ นั่นคือกางเกงขาสั้นสําหรับผู้ใช้ในการออกแบบและทดลองวิธีการเขียนเหรียญของตัวเอง

ก่อนที่เขาจะหายตัวไป Satoshi Nakamoto ได้ลบรหัสปฏิบัติการเหล่านี้ 15 รหัสปิดใช้งานทั้งหมดและเพิ่มขีด จํากัด อย่างหนักในสแต็คเอ็นจิ้นการเขียนสคริปต์ที่ จํากัด ขนาดของบล็อกข้อมูลที่สามารถจัดการได้ (520 ไบต์) นี่เป็นเพราะเขาเมาจริง ๆ โดยทิ้งหลายวิธีที่สคริปต์ที่ซับซ้อนสามารถใช้เพื่อโจมตี DOS เครือข่ายทั้งหมด (ส่งคําขอสแปมจํานวนมากทําให้เครือข่ายล่ม) สร้างธุรกรรมขนาดใหญ่และมีค่าใช้จ่ายสูงซึ่งจะทําให้โหนดล้มเหลว

รหัสการทํางานเหล่านี้ไม่ได้ถูกลบออกเนื่องจาก Satoshi Nakamoto คิดว่าคุณสมบัตินั้นเป็นอันตรายหรือผู้คนไม่ควรใช้เพื่อสร้างสิ่งที่สามารถทําได้ แต่เพียง (อย่างน้อยก็บนพื้นผิว) เนื่องจากความเสี่ยงที่พวกเขาก่อให้เกิดกับเครือข่ายทั้งหมดโดยไม่มีข้อ จํากัด ด้านทรัพยากรเช่นค่าใช้จ่ายในการตรวจสอบที่เลวร้ายที่สุดที่พวกเขาสามารถกําหนดบนเครือข่ายได้โดยไม่มีข้อ จํากัด

ตั้งแต่นั้นมาการอัปเกรด Bitcoin แต่ละครั้งก็จบลงด้วยการเพิ่มประสิทธิภาพการทํางานของคุณสมบัติที่เหลือแก้ไขข้อบกพร่องที่ร้ายแรงน้อยกว่าอื่น ๆ ที่ Satoshi Nakamoto ทิ้งเราไว้และขยายฟังก์ชันการทํางานของชุดย่อยสคริปต์ที่เหลืออยู่ของเรา

การกู้คืนสคริปต์ที่ยอดเยี่ยม

ในการประชุม Austin Bitcoin ++ เมื่อต้นเดือนพฤษภาคม Rusty Russell ผู้พัฒนาเครือข่ายแสงสว่างหลักได้เสนอข้อเสนอที่รุนแรงมากในการกล่าวสุนทรพจน์ครั้งแรกของเขาในการประชุมซึ่งโดยพื้นฐานแล้วเขาได้แนวคิดในการเปิดใช้งานรหัสปฏิบัติการขนาดใหญ่ที่ Satoshi Nakamoto ได้ปิดใช้งานก่อนที่จะหายไปในปี 2010

ในช่วงหลายปีที่ผ่านมานับตั้งแต่เปิดใช้งาน Taproot ในปี 2021 (Taproot เป็นการอัปเกรดครั้งใหญ่สําหรับ Bitcoin ที่มีจุดมุ่งหมายเพื่อปรับปรุงความเป็นส่วนตัวความปลอดภัยและความสามารถในการปรับขนาด) พื้นที่การพัฒนานั้นค่อนข้างไร้จุดหมาย เราทุกคนรู้ดีว่า Bitcoin ไม่สามารถปรับขนาดได้เพียงพอที่จะให้บริการอธิปไตยด้วยตนเองอย่างแท้จริงแก่ประชากรโลกทุกขนาดและอาจไม่สามารถให้ความสามารถในการปรับขนาดแก่ผู้ให้บริการที่สามารถแซงหน้าผู้ดูแลและผู้ให้บริการที่มีขนาดใหญ่มากและไม่สามารถหลุดพ้นจากข้อ จํากัด ด้านแขนยาวของรัฐบาลได้อย่างแท้จริงในลักษณะที่ลดความไว้วางใจหรือการดูแล

บทความนี้ชี้ไปที่ระดับทางเทคนิคของ Bitcoin ซึ่งไม่ใช่ประเด็นที่ต้องถกเถียงกัน คําถามที่ควรค่าแก่การถกเถียงคือวิธีแก้ไขข้อบกพร่องนี้ซึ่งเป็นหัวข้อที่ถกเถียงกันมาก ตั้งแต่ Taproot ได้รับการแนะนําทุกคนได้จัดทําข้อเสนอที่แคบมากซึ่งมีจุดมุ่งหมายเพื่อแก้ปัญหาที่สามารถทําได้สําหรับกรณีการใช้งานเฉพาะเท่านั้น

ตัวอย่างเช่น ANYPREVOUT (APO) เป็นข้อเสนอที่อนุญาตให้นําลายเซ็นกลับมาใช้ใหม่ในธุรกรรมต่างๆ ตราบใดที่สคริปต์และจํานวนเงินที่ป้อนเหมือนกัน และข้อเสนอนี้ได้รับการออกแบบมาโดยเฉพาะเพื่อเพิ่มประสิทธิภาพเครือข่ายแสงสว่างและเวอร์ชันที่ยาวกว่า CHECKTEMPLATEVERIFY (CTV) เป็นข้อเสนอที่ต้องใช้เหรียญแข็งเพื่อใช้โดยธุรกรรมที่ตรงกับธุรกรรมที่กําหนดไว้ล่วงหน้าเท่านั้นและข้อเสนอนี้ออกแบบมาเพื่อขยายการทํางานของห่วงโซ่ธุรกรรมที่ลงนามล่วงหน้าโดยทําให้ไม่น่าเชื่อถืออย่างสมบูรณ์ OP_VAULT ได้รับการออกแบบมาโดยเฉพาะเพื่อตั้งค่า "หมดเวลา" สําหรับโซลูชันห้องเย็น เพื่อให้ผู้ใช้สามารถ "ยกเลิกการดึง" จากห้องเย็นได้โดยส่งไปยังการตั้งค่าที่ยาวกว่าเพื่อป้องกันไม่ให้รหัสลับถูกบุกรุก

มีข้อเสนออื่น ๆ ที่ยาวที่สุด แต่ฉันคิดว่าคุณได้รับส่วนสําคัญแล้ว ในช่วงไม่กี่ปีที่ผ่านมาแต่ละข้อเสนอได้รับการออกแบบมาเพื่อเพิ่มความสามารถในการปรับขนาดเล็กน้อยหรือปรับปรุงคุณสมบัติเล็ก ๆ น้อย ๆ เดียวเนื่องจากถือว่าเป็นที่ต้องการ นั่นคือสาเหตุที่แท้จริงว่าทําไมการอภิปรายเหล่านี้จึงไม่มีความคืบหน้า ไม่มีใครพอใจกับข้อเสนออื่น ๆ เพราะพวกเขาไม่ตรงตามกรณีการใช้งานที่พวกเขาต้องการเห็น

ไม่มีใครอื่นนอกจากผู้สนับสนุนข้อเสนอเชื่อว่าข้อเสนอใด ๆ ที่ครอบคลุมพอที่จะได้รับการพิจารณาในขั้นตอนต่อไปที่สมเหตุสมผล

นี่คือตรรกะที่อยู่เบื้องหลัง "Great Script Recovery" ด้วยการผลักดันและวิเคราะห์การกู้คืนสคริปต์อย่างเต็มรูปแบบตามที่ Satoshi Nakamoto ออกแบบไว้ในตอนแรกเราสามารถลองสํารวจกางเกงขาสั้นคุณลักษณะทั้งหมดที่เราต้องการแทนที่จะโต้เถียงและต่อสู้ว่าส่วนขยายคุณลักษณะขนาดเล็กใดที่ดีพอในขณะนี้

OPCODES (รหัสการทํางาน)

  • OP_CAT: นําข้อมูลสองชิ้นจากสแต็คมารวมกันเพื่อสร้างข้อมูลเดียว
  • OP \ _SUBSTR : ยอมรับพารามิเตอร์ความยาว (เป็นไบต์) รับชิ้นส่วนของข้อมูลจากสแต็คลบไบต์ของความยาวที่และนํากลับมาบนสแต็ค
  • OP_LEFT และ OP_RIGHT: ยอมรับพารามิเตอร์ความยาวที่ใช้ชิ้นส่วนของข้อมูลจากสแต็คและลบไบต์ของความยาวที่ระบุจากด้านใดด้านหนึ่ง
  • OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_UPSHIFT และ OP_DOWNSHIFT: ยอมรับองค์ประกอบข้อมูลและดําเนินการบิตที่เกี่ยวข้อง
  • OP_ 2 MUL, OP_2D IV, OP_MUL, OP_DIV และ OP_MOD: ตัวดําเนินการทางคณิตศาสตร์สําหรับการคูณ การหาร และการดําเนินการโมดูโล (ส่งกลับส่วนที่เหลือของการหาร)

นอกเหนือจากรายการรหัสปฏิบัติการข้างต้นที่จะกู้คืนแล้ว Rusty Russell ยังเสนอรหัสการทํางานอีกสามรหัสที่ออกแบบมาเพื่อลดความซับซ้อนของรหัสการทํางานที่แตกต่างกัน:

OP_CTV (หรือรหัสการทํางานที่เทียบเท่า TXHASH/ ): อนุญาตให้มีการบังคับใช้บางส่วนของธุรกรรมที่ต้องตรงตามที่กําหนดไว้ล่วงหน้า

CSFS: อนุญาตให้ตรวจสอบลายเซ็นไม่ใช่แค่สําหรับธุรกรรมทั้งหมดซึ่งกําหนดให้ต้องลงนามในบางส่วนของสคริปต์หรือข้อมูลที่ใช้เพื่อดําเนินการ

OP_TWEAKVERIFY: ตรวจสอบการดําเนินการที่ใช้ Schnorr ที่เกี่ยวข้องกับคีย์สาธารณะ เช่น การเพิ่มหรือลบคีย์สาธารณะแต่ละรายการออกจากคีย์สาธารณะรวม สิ่งนี้สามารถใช้เพื่อให้แน่ใจว่าเมื่อฝ่ายหนึ่งออกจากเอาต์พุตธุรกรรมที่ไม่ได้ใช้ร่วมกัน (UTXO) เพียงฝ่ายเดียวเงินของผู้เข้าร่วมคนอื่น ๆ ทั้งหมดจะถูกส่งไปยังคีย์สาธารณะรวมที่ไม่ต้องการการลงนามของฝ่ายที่ออกเดินทางเพื่อใช้จ่ายแบบมีส่วนร่วม

ทําไมเราถึงทําเช่นนี้

เครือข่ายเลเยอร์ 2 เป็นส่วนขยายของเลเยอร์พื้นฐานของ Bitcoin เป็นหลัก และถูกจํากัดการทํางานโดยฟังก์ชันของเลเยอร์ฐาน Lighting Network ต้องการ Soft Fork สามตัวแยกกันก่อนที่จะสามารถใช้งานได้จริง: CHECKLOCKTIMEVERIFY (CLTV), checksequenceverify (csv) และ SegWit (พยานแยก)

หากไม่มีเลเยอร์ฐานที่ยืดหยุ่นกว่าคุณจะไม่สามารถสร้างเครือข่ายเลเยอร์ 2 ที่ยืดหยุ่นกว่านี้ได้ ทางลัดเดียวคือการไว้วางใจบุคคลที่สามซึ่งง่ายมากและตรงไปตรงมาและฉันหวังว่าเราทุกคนปรารถนาที่จะลบบุคคลที่สามที่เชื่อถือได้ออกจากทุกแง่มุมของการโต้ตอบกับ Bitcoin ในวงกว้างให้มากที่สุด

เราจําเป็นต้องสามารถทําสิ่งที่ไม่สามารถทําได้ในปัจจุบันเพื่อรวมคนมากกว่าสองคนเข้าด้วยกันอย่างปลอดภัยในเอาต์พุตธุรกรรมที่ไม่ได้ใช้ (UTXO) เดียวและสามารถดําเนินการได้อย่างน่าเชื่อถือบนเลเยอร์พื้นฐาน ความยืดหยุ่นในปัจจุบันของ Bitcoin Script ไม่เพียงพอ ในระดับพื้นฐานที่สุดเราต้องการสัญญาและเราต้องการสคริปต์ที่สามารถบังคับใช้รายละเอียดปลีกย่อยเกี่ยวกับการทําธุรกรรมเพื่อให้แน่ใจว่าผู้ใช้ออกจาก UTXO ของตนเองอย่างปลอดภัยจะไม่ทําให้เงินทุนของผู้ใช้รายอื่นตกอยู่ในความเสี่ยง

ในมุมมองที่สูงขึ้นนี่คือสิ่งที่เราต้องการ:

วิปัสสนา: เราจําเป็นต้องสามารถตรวจสอบรายละเอียดเฉพาะบนสแต็คเกี่ยวกับธุรกรรมการใช้จ่ายได้จริง เช่น "เงินจํานวนนี้จะไปที่คีย์สาธารณะของเอาต์พุตบางส่วน" สิ่งนี้ช่วยให้ฉันสามารถถอนเงินได้ด้วยตัวเองโดยใช้สาขา Taproot เฉพาะของฉันเองในขณะที่มั่นใจได้ว่าฉันไม่สามารถถอนเงินของคนอื่นได้ สคริปต์ที่ดําเนินการจะช่วยให้มั่นใจได้ว่าเงินของเจ้าของรายอื่นจะถูกส่งกลับไปยังที่อยู่ที่ประกอบด้วยคีย์สาธารณะของผู้ใช้รายอื่นในกรณีที่ผู้เข้าร่วมรายอื่นทําให้สูญเสียเงิน

Forward Data Carrying: สมมติว่าเราใช้แนวคิดของ UTXO เดียวเช่นกับผู้คนจํานวนมากที่ทุกคนสามารถมาและไปได้ตามต้องการ ในกรณีนี้เราต้องการวิธีติดตามว่าใครมีเงินนานที่สุดหรือน้อยกว่าโดยปกติจะใช้ Merkle Tree และรากของมัน ซึ่งหมายความว่าเมื่อมีคนจากไปเราต้องแน่ใจว่าได้ "บันทึก" ว่าใครมีสิทธิ์ได้รับสิ่งที่เป็นส่วนหนึ่งของการเปลี่ยนแปลง UTXO สําหรับเงินทุนของคนอื่น นี่เป็นการใช้วิปัสสนาเฉพาะ

การแก้ไขคีย์สาธารณะ: เราจําเป็นต้องตรวจสอบให้แน่ใจว่าการแก้ไขคีย์สาธารณะรวมสามารถตรวจสอบได้บนสแต็ก ในโครงการแบ่งปัน Unused Transaction Output (UTXO) เป้าหมายของเราคืออํานวยความสะดวกในความร่วมมือและการไหลเวียนของเงินทุนที่มีประสิทธิภาพผ่านคีย์สาธารณะรวมที่มีผู้เข้าร่วมทั้งหมด เมื่อมีคนออกจาก UTXO ที่แชร์เพียงฝ่ายเดียว เราจําเป็นต้องลบคีย์สาธารณะส่วนบุคคลออกจากคีย์สาธารณะรวม หากไม่ได้คํานวณชุดค่าผสมที่เป็นไปได้ทั้งหมดล่วงหน้าตัวเลือกเดียวคือการตรวจสอบว่าการลบคีย์สาธารณะหนึ่งคีย์ออกจากคีย์สาธารณะรวมจะสร้างคีย์สาธารณะที่ถูกต้องซึ่งประกอบด้วยคีย์สาธารณะที่เหลือ

วิธีรักษาความปลอดภัย: VAROPS ดังที่ฉันได้กล่าวไว้ข้างต้นเหตุผลในการปิดใช้งานรหัสการทํางานทั้งหมดเหล่านี้คือเพื่อจัดการกับการโจมตี DOS (ซึ่งทําให้เครือข่ายขัดข้องโดยการส่งคําขอสแปมจํานวนมาก) ซึ่งอาจทําให้โหนดที่ประกอบขึ้นเป็นเครือข่ายหยุดทํางาน วิธีหนึ่งในการแก้ปัญหานี้คือการ จํากัด จํานวนทรัพยากรที่สามารถใช้โดยรหัสปฏิบัติการเหล่านี้

เมื่อพูดถึงการตรวจสอบลายเซ็นส่วนที่แพงที่สุดของสคริปต์ Bitcoin เรามีโซลูชันดังกล่าวอยู่แล้วซึ่งเรียกว่างบประมาณการดําเนินการลายเซ็น (sigops) การใช้รหัสปฏิบัติการการตรวจสอบลายเซ็นแต่ละครั้งจะใช้ "งบประมาณ" บางอย่างนั่นคือจํานวนการดําเนินการลายเซ็นที่อนุญาตต่อบล็อกซึ่งกําหนดขีด จํากัด อย่างหนักสําหรับต้นทุนที่ธุรกรรมสามารถสร้างเพื่อตรวจสอบบล็อก

Taproot เปลี่ยนวิธีการทํางานนี้โดยไม่ใช้ขีด จํากัด บล็อกส่วนกลางอีกต่อไป แต่แต่ละธุรกรรมมีขีด จํากัด sigops (การดําเนินการลายเซ็น) ของตัวเองตามสัดส่วนของขนาดของธุรกรรม โดยพื้นฐานแล้วสิ่งนี้เท่ากับขีด จํากัด ทั่วโลกเดียวกัน แต่ง่ายต่อการเข้าใจว่าแต่ละธุรกรรมมี sigops น้อยกว่านาน

การเปลี่ยนแปลงขีด จํากัด sigops (การดําเนินการลายเซ็น) ของ Taproot สําหรับการประมวลผลแต่ละธุรกรรมเปิดความเป็นไปได้ของวิธีการทั่วไปซึ่งเป็นสิ่งที่ Rusty Russell แนะนําในแง่ของขีด จํากัด varops แนวคิดคือการกําหนดต้นทุนให้กับรหัสการทํางานที่เปิดใช้งานใหม่แต่ละรายการเพื่อพิจารณาสถานการณ์ที่เลวร้ายที่สุดที่รหัสปฏิบัติการแต่ละรหัสอาจสร้างขึ้นนั่นคือต้นทุนการคํานวณที่แพงที่สุดที่เกิดขึ้นในขณะที่ตรวจสอบความถูกต้อง ด้วยวิธีนี้รหัสการทํางานแต่ละรหัสจะมีขีด จํากัด "sigops" ของตัวเองโดย จํากัด จํานวนทรัพยากรที่สามารถใช้ในระหว่างกระบวนการตรวจสอบความถูกต้อง นอกจากนี้ยังจะขึ้นอยู่กับขนาดของธุรกรรมใด ๆ ที่ใช้รหัสปฏิบัติการเหล่านี้ดังนั้นการอนุมานสามารถอํานวยความสะดวกในขณะที่ยังคงสะสมถึงขีด จํากัด ทั่วโลกโดยนัยต่อบล็อก

สิ่งนี้จะแก้ปัญหาการโจมตี DOS (โดยการส่งคําขอสแปมจํานวนมากทําให้เครือข่ายล่ม) เนื่องจากธุรกรรมสแปมเหล่านี้และสิ่งที่ทําให้ Satoshi Nakamoto ปิดการใช้งานรหัสการทํางานเหล่านั้นทั้งหมดในขั้นต้น

โมเมนตัมที่จะก้าวไปข้างหน้า

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

มันจะเป็นการเปลี่ยนแปลงที่สมบูรณ์จากสามปีที่ผ่านมาของ bickering และโต้วาทีที่เราเพิ่งได้รับการโต้เถียงเกี่ยวกับการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ที่มีเพียงฟังก์ชั่นบางอย่าง มันเป็นเหมือนสี่เหลี่ยมจัตุรัสที่ทุกคนสามารถมารวมกันและมองทิศทางของอนาคตได้ บางทีในที่สุดเราจะกู้คืนคุณสมบัติเหล่านี้ทั้งหมดหรือบางทีเราอาจเปิดใช้งานคุณสมบัติเพียงไม่กี่รายการเพราะฉันทามติคือสิ่งเหล่านี้เป็นสิ่งที่เราทุกคนเห็นด้วยว่าจําเป็นต้องเปิดใช้งาน

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

มันไม่ใช่เส้นทางที่เราต้องใช้ แต่ฉันคิดว่ามันเป็นโอกาสที่ดีที่สุดสําหรับเราที่จะตัดสินใจว่าเราต้องการใช้เส้นทางใด ถึงเวลาที่จะเริ่มทํางานร่วมกันอีกครั้งในทางปฏิบัติและมีประสิทธิผล

ดูต้นฉบับ
  • รางวัล
  • แสดงความคิดเห็น
  • แชร์
แสดงความคิดเห็น
ไม่มีความคิดเห็น