ทำความเข้าใจ Argon2id Proof of Work

· อ่าน 7 นาที

บทความนี้อธิบายว่า Argon2id คืออะไร Blocknet นำมาใช้เป็น Proof of Work อย่างไร ทำไมหน่วยความจำเร็วจำนวนมากจึงช่วยได้ และ seine รีดจำนวนแฮชจาก CPU แต่ละตัวที่ใช้งานอย่างไร

Argon2id คืออะไร?

คำตอบสั้นๆ

Argon2id คือฟังก์ชันแฮชแบบ memory-hard ที่กำหนดใน RFC 9106 สำหรับแฮชรหัสผ่านและ Proof of Work โดยเติมบล็อกขนาด 1 KiB ลงในพื้นที่หน่วยความจำขนาดใหญ่ สร้างแต่ละบล็อกจากบล็อกก่อนหน้าและบล็อกเก่าอีกบล็อกที่เลือกจากตำแหน่งอื่นในหน่วยความจำ การคำนวณแฮชจึงต้องใช้หน่วยความจำจริงควบคู่กับเวลาประมวลผล

RFC 9106 ซึ่งเผยแพร่ในปี 2021 โดย Crypto Forum Research Group ของ IRTF อธิบายว่าเป็น “ฟังก์ชัน Argon2 แบบ memory-hard สำหรับการแฮชรหัสผ่านและงาน Proof of Work” Argon2 มีสามรูปแบบ:

ภายใน Argon2 มองหน่วยความจำเป็นแถวยาวของบล็อกขนาด 1,024 bytes แต่ละบล็อกใหม่เป็นผลของฟังก์ชันบีบอัด G ที่รับสองอินพุต ได้แก่ บล็อกก่อนหน้าทันทีและบล็อกอ้างอิงก่อนหน้านั้นในหน่วยความจำ G สร้างบนรอบผสมข้อมูลของฟังก์ชันแฮช BLAKE2b ซึ่งทำงานกับคำขนาด 64-bit ด้วยการบวก XOR และการหมุนบิต

Blocknet ใช้ Argon2id เป็น Proof of Work อย่างไร?

Blocknet กำหนดค่า Argon2id ทุกค่าไว้ในโค้ดฉันทามติ นักขุดและโหนดทุกตัวจึงคำนวณฟังก์ชันเดียวกันทุกประการ:

พารามิเตอร์ ค่าของ Blocknet ความหมาย
รูปแบบ Argon2id เวอร์ชัน 1.3 รูปแบบหลักของ RFC 9106
หน่วยความจำ 2 GiB (2,097,152 KiB) เติมบล็อกขนาด 1 KiB จำนวน 2,097,152 บล็อกต่อแฮช
จำนวนรอบ 1 ผ่านหน่วยความจำหนึ่งรอบ
Parallelism 1 หนึ่งเลน แฮชหนึ่งครั้งจึงทำงานบนหนึ่งเธรด
ผลลัพธ์ 32 bytes ค่าที่นำไปเปรียบเทียบกับเป้าหมาย
รหัสผ่าน nonce ขนาด 8 bytes แบบ little-endian ตัวเลขที่นักขุดเปลี่ยนในแต่ละครั้ง
Salt ส่วนหัวบล็อกที่ไม่รวม nonce ผูกแฮชกับเทมเพลตบล็อกหนึ่งชุด

การขุดคือการค้นหา นักขุดนำส่วนหัวของบล็อกที่ต้องการเผยแพร่มาเลือก nonce แล้วคำนวณแฮช Argon2id หากผลลัพธ์ 32 bytes ซึ่งอ่านเป็นตัวเลขมีค่าน้อยกว่าหรือเท่ากับเป้าหมายเครือข่าย บล็อกนั้นก็ถูกต้อง หากไม่ใช่ นักขุดจะลอง nonce ถัดไป

เป้าหมายมาจากความยากโดยตรง คือ (2^256 − 1) หารด้วยความยาก ทำให้ความยากใกล้เคียงกับจำนวนแฮชที่คาดว่าทั้งเครือข่ายต้องคำนวณเพื่อพบบล็อกหนึ่งบล็อก Blocknet ตั้งเป้าหนึ่งบล็อกทุกห้านาที แฮชเรตเครือข่ายจึงประมาณความยากหารด้วย 300 วินาที ส่วนความยากติดตามเวลาบล็อกล่าสุดผ่านค่าเฉลี่ยเคลื่อนที่ถ่วงน้ำหนัก 60 บล็อก

พูลทำงานแบบเดียวกันด้วยเป้าหมายที่ง่ายกว่า บน bntpool.com โปรแกรมขุด seine ส่งแชร์ที่ผ่านความยากต่อการเชื่อมต่อซึ่งต่ำกว่า และแชร์ใดที่ผ่านเป้าหมายเครือข่ายด้วยก็คือบล็อกที่พบ

ทำไม Proof of Work แบบ memory-hard จึงเหมาะกับคอมพิวเตอร์ทั่วไป?

ค่าข้างต้นทำให้หน่วยความจำเป็นศูนย์กลางของทุกแฮช เมื่อมีหนึ่งรอบและหนึ่งเลน ครึ่งหลังของรอบจะขึ้นกับข้อมูล โดยตำแหน่งบล็อกอ้างอิงแต่ละบล็อกมาจากคำ 64-bit แรกของบล็อกที่เพิ่งคำนวณก่อนหน้า นักขุดไม่รู้ล่วงหน้าว่าจะต้องใช้บล็อกเก่าใดจนถึงเวลาที่ต้องใช้ จึงเก็บพื้นที่ 2 GiB ทั้งหมดไว้ในหน่วยความจำ

นักขุดอาจลองเก็บบล็อกน้อยลงแล้วคำนวณบล็อกที่ขาดใหม่เมื่อต้องใช้ RFC 9106 เรียกวิธีนี้ว่าการแลกเวลามาเป็นหน่วยความจำ ซึ่งประหยัดหน่วยความจำ “โดยแลกกับการเรียกฟังก์ชันบีบอัดภายในมากขึ้น” ทุกบล็อกที่ไม่เก็บไว้ต้องจ่ายคืนด้วยการคำนวณเพิ่มเติม

นี่คือเหตุผลที่การออกแบบนี้เหมาะกับฮาร์ดแวร์ทั่วไป เดสก์ท็อป แล็ปท็อป และเซิร์ฟเวอร์มี RAM หลายกิกะไบต์พร้อมตัวควบคุมหน่วยความจำอยู่แล้ว ชิปที่ออกแบบเพื่อแฮชอย่างเดียวก็ยังต้องมีหน่วยความจำเร็วหลายกิกะไบต์ข้างคอร์แฮช ค่าแนะนำชุดแรกใน RFC 9106 คือ Argon2id หนึ่งรอบบนหน่วยความจำ 2 GiB ซึ่งมีจำนวนรอบและขนาดหน่วยความจำเท่ากับที่ Blocknet ใช้ และ RFC ระบุว่าค่านี้ “เพิ่มต้นทุนของผู้โจมตีบนฮาร์ดแวร์เฉพาะทางสำหรับ brute force ให้สูงสุด” โค้ด daemon ของ Blocknet อธิบายการเลือก Proof of Work แบบ memory-hard ว่า “เพื่อต้านทาน ASIC และให้การขุดเป็นธรรม” Argon2id ออกแบบมาต้านทาน ASIC และค่า 2 GiB นำการออกแบบนั้นมาใช้งาน การขุดจึงเปิดกว้างให้คอมพิวเตอร์ที่ผู้คนมีอยู่แล้ว คู่มือ Proof of Work เทียบกับ Proof of Stake อธิบายการเปรียบเทียบกับ staking

ทำไม RAM และแบนด์วิดท์หน่วยความจำจึงกำหนดแฮชเรต?

คำตอบสั้นๆ

แต่ละเธรดขุดเก็บพื้นที่ 2 GiB ของตัวเอง RAM จึงกำหนดจำนวนเธรดที่คุณเปิดได้ แต่ละแฮชยังเขียน 2 GiB และอ่านกลับประมาณเท่ากันจากตำแหน่งกระจัดกระจาย ความเร็วและความหน่วงของหน่วยความจำจึงกำหนดว่าเธรดจะเสร็จเร็วเพียงใด หน่วยความจำสำคัญพอๆ กับจำนวนคอร์

RAM กำหนดจำนวนเธรด Parallelism 1 หมายถึงหนึ่งแฮชทำงานบนหนึ่งเธรด และแต่ละเธรดต้องมีพื้นที่ 2 GiB เต็มของตัวเอง เครื่องที่มี 16 GB เปิดได้ราวหกถึงเจ็ดเธรดหลังเผื่อพื้นที่ให้ระบบ seine วัดหน่วยความจำ สำรองไว้ 5% และเลือกจำนวนเธรดให้คุณ

แบนด์วิดท์และความหน่วงกำหนดความเร็วแต่ละเธรด หนึ่งแฮชสร้างบล็อกใหม่ 2,097,152 บล็อก และแต่ละบล็อกอ่านบล็อกอ้างอิง 1 KiB จากตำแหน่งหนึ่งในพื้นที่นั้น รวมเป็นการเขียนประมาณ 2 GiB และอ่านประมาณ 2 GiB ต่อแฮช ที่ 10 H/s เครื่องถ่ายโอนข้อมูลผ่านหน่วยความจำราว 40 GiB ทุกวินาที ในครึ่งที่ขึ้นกับข้อมูล ที่อยู่อ่านแต่ละตำแหน่งจะทราบต่อเมื่อบล็อกก่อนหน้าเสร็จแล้ว เวลาตอบสนองของหน่วยความจำจึงสำคัญพอๆ กับปริมาณรับส่งข้อมูล

นี่คือเหตุผลที่หน้าประสิทธิภาพของ seine ระบุว่าแฮชเรต “ขึ้นกับแบนด์วิดท์และความหน่วงหน่วยความจำพอๆ กับจำนวนคอร์” คู่มือฮาร์ดแวร์ขุด Blocknet แสดงผลดีที่สุดของฮาร์ดแวร์แต่ละเจเนอเรชัน

huge pages ช่วยด้วยเหตุผลเดียวกัน พื้นที่ 2 GiB ครอบคลุมเพจปกติขนาด 4 KiB จำนวน 524,288 เพจ หรือเพจขนาด 2 MiB จำนวน 1,024 เพจ เพจที่ใหญ่ขึ้นและน้อยลงลดการพลาดในการแปลที่อยู่ระหว่างการอ่านแบบกระจัดกระจาย ซึ่งเพิ่มได้ประมาณ 4–6% บนเครื่องตรวจสอบของ seine คู่มือ huge pages มีขั้นตอนตั้งค่า

เคอร์เนล CPU ของ seine ใช้ Argon2id ได้เต็มที่อย่างไร?

เคอร์เนลคือลูปภายในที่คำนวณบล็อก รุ่น x86 ของ seine มีเคอร์เนล scalar, AVX2 และ AVX-512 รวมทั้งรูปแบบ streaming ส่วนรุ่น Arm มี NEON พร้อมเส้นทางเร็ว SHA3 แต่ละแบบจัดการงานที่ติดข้อจำกัดหน่วยความจำต่างกัน:

บนฮาร์ดแวร์ที่เราทดสอบ เคอร์เนลที่เหมาะสมสร้างความต่างมาก ผลต่อไปนี้เป็นการทดสอบคู่บนเครื่องเดียวกันและจำนวนเธรดเท่ากัน จากหน้าประสิทธิภาพของ seine:

เครื่อง การเปลี่ยนเคอร์เนล เพิ่มขึ้น
AWS Graviton4 (Neoverse V2), 16 เธรด NEON เป็น SHA3 พร้อม prefetch +56% (13.80 เป็น 21.50 H/s)
AWS Graviton3 (Neoverse V1), 16 เธรด NEON เป็น SHA3 พร้อม prefetch +45% (12.52 เป็น 18.17 H/s)
AMD EPYC 9R45 (Zen 5), 24 เธรด AVX2 เป็น streaming +30% (34.47 เป็น 44.74 H/s)
Intel Xeon 8375C (Ice Lake), 1–4 เธรด AVX2 เป็น AVX-512 +21–29%

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

หากต้องการใช้หน่วยความจำของคุณขุด ให้ดาวน์โหลด seine เรียกใช้ แล้ววางที่อยู่ของคุณ คู่มือการขุด อธิบายส่วนที่เหลือ

คำถามที่พบบ่อย

Blocknet ใช้พารามิเตอร์ Argon2id ใดสำหรับ Proof of Work?

Blocknet ใช้ Argon2id เวอร์ชัน 1.3 กับหน่วยความจำ 2 GiB ทำงานหนึ่งรอบ parallelism 1 และผลลัพธ์ 32 bytes โดย nonce ขนาด 8 bytes เป็นรหัสผ่าน และส่วนหัวบล็อกที่ไม่รวม nonce เป็น salt แฮชจะชนะบล็อกเมื่อมีค่าน้อยกว่าหรือเท่ากับเป้าหมายที่ความยากของเครือข่ายกำหนด

ทำไมแต่ละเธรดขุด Blocknet ต้องใช้ RAM 2 GB?

ทุกแฮช Argon2id เติมบล็อกขนาด 1 KiB ลงในหน่วยความจำ 2 GiB และในครึ่งหลังของรอบ แต่ละบล็อกใหม่จะอ่านบล็อกก่อนหน้าที่เลือกจากข้อมูลซึ่งนักขุดคาดเดาไม่ได้ เธรดต้องเก็บพื้นที่ทั้งหมดไว้ในหน่วยความจำ แต่ละเธรดที่ทำงานจึงต้องใช้ RAM ประมาณ 2 GB

ทำไม Argon2id จึงออกแบบมาให้ต้านทาน ASIC?

Argon2id ทำให้หน่วยความจำเป็นส่วนที่มีต้นทุนสูงของทุกแฮช แฮช Blocknet แต่ละครั้งต้องใช้หน่วยความจำเร็ว 2 GiB และถ่ายโอนข้อมูลหลายกิกะไบต์ ดังนั้นชิปที่สร้างมาเพื่อแฮชอย่างเดียวก็ยังต้องมี RAM จำนวนมากต่อคอร์ โค้ด daemon อธิบายการเลือกนี้ว่าเป็น Proof of Work แบบ memory-hard เพื่อต้านทาน ASIC และให้การขุดเป็นธรรม

การ์ดจอขุด Argon2id ของ Blocknet ได้ไหม?

ได้ บน Windows และ Linux โปรแกรมขุด seine ใช้การ์ดจอ NVIDIA ทุกตัวในเครื่องพร้อมกับ CPU และแฮชเรตจะรวมกัน เคอร์เนลคอมไพล์ตอนเริ่มทำงาน และการเปิดครั้งแรกจะปรับจูนแต่ละการ์ดพร้อมแคชผลไว้ จึงไม่ต้องตั้งค่าก่อนเริ่ม