ตอนนี้คืองงตึ้บเลยครับ พอเปลี่ยนบาง net มันมา แต่พอกลับมาเน็ตของที่ทำงานมันไม่มา อาจจะเป็นที่ firewall policy ของฝั่งผม ผมไม่แน่ใจ แต่ขอบคุณมากครับ


งงครับนี่ไดโนเสาร์


Difficulty Adjustment Algorithm

Difficulty Adjustment Algorithm (DAA) เป็นอีกส่วนหนึ่งที่สำคัญในระบบของบิตคอยน์ เนื่องจากมันเป็นตัวควบคุมความยากง่ายในการขุดบิตคอยน์ ซึ่งความยากง่ายนี้เอง จะส่งผลโดยตรงต่อความเร็วในการขุดบล็อกใหม่รวมไปถึงความมั่นคงของเครือข่ายบิตคอยน์ DAA ทำงานโดยการปรับเปลี่ยนค่า hash เป้าหมายโดยจะยากขึ้นหรือง่ายลงตามกำลังขุดในเครือข่าย เพื่อให้เวลาเฉลี่ยในการขุดบล๊อกใหม่นั้นคงที่ ซึ่ง DAA เป็นสิ่งสำคัญมาก เพราะมันช่วยรักษาความมั่นคงของเครือข่ายและป้องกันความผันผวนของกำลังขุด เนื่องจากหากเวลาในการขุดต่อบล๊อกนั้นมากเกินไป อาจทำให้เครือข่ายอ่อนแอ และง่ายต่อการโจมตีในอนาคต โดยในบิตคอยน์นั้นเราใช้ DAA ที่เรียกว่า "Median Time Past" (MTP) โดยมีหลักการดังนี้
เวลาขุดบล็อกนานกว่า 10 นาที: MTP จะเพิ่มค่าเป้าหมาย ทำให้การขุดบล็อกใหม่ยากขึ้น
เวลาขุดบล็อกน้อยกว่า 10 นาที: MTP จะลดค่าเป้าหมาย ทำให้การขุดบล็อกใหม่ง่ายขึ้น

ตามสมการนี้
New Difficulty = Old Difficulty × (Actual Time / Target Time)
โดยมีการกำหนด target time ไว้ที่ 600
แปลว่า New diff มาจากการที่ใช้ old diff คูณกับ เวลาที่ใช้ไปในหน่วยวินาทีหารกับ 600 ถ้าดูจากสมการนี้จะเห็นได้ว่าตัวแปรที่สำคัญในการกำหนดว่าค่าจะเพิ่มหรือลดอยู่ที่ Actual time ซึ่งทำให้มั่นใจได้เลยว่าเวลาเฉลี่ยของบล๊อกของบิตคอยน์จะอยู่ที่ 10 นาที โดยเฉลี่ย
#siamstr


น้องวัว TT
nostr address get ไม่เจอครับ
https://image.nostr.build/764ff1ce877446e88d3e2dfe0701e6fd76bcace683cbecfcae8b38b9542ba44a.png


Merkle Tree

Merkle Tree เป็น hash-based data structure เหมือนกับ binary tree แต่แตกต่างกันตรงที่ leaf node จะทำการเก็บเพียงแค่ค่า hash ของข้อมูลธุรกรรม ส่วน node ที่ไม่ใช่ leaf node จะเก็บค่าจากการ hash ที่ได้จาก children node หากจะให้เห็นภาพมากขึ้นลองมาดูตัวอย่างตามนี้กันครับ
สมมุติให้มี transaction ทั้งหมด 4 transaction: t1, t2, t3, t4 ก็แปลว่า hash ของทั้ง 4 transaction ก็จะเป็น leaf node ดังนี้
H(1), H(2), H(3), H(4) และเนื่องจาก 1 node จะมี 2 children แปลว่า ก็จำเป็นต้องมี 2 node ที่เก็บ hash ของ H(1), H(2), H(3), H(4) ดังนั้นในชั้นที่ 2 ของ tree แต่ละ node จะต้องเก็บข้อมูลเป็น H(H(1)+H(2)), และ H(H(3)+H(4)) ตามลำดับ และดังที่กล่าวไว้ข้างต้น เนื่องจาก 1 node จะมี 2 children แปลว่า ก็จำเป็นต้องมี 1 node ที่เก็บค่า H(H(H(1)+H(2)) + H(H(3)+H(4))) ดังรูปที่แสดงข้างล่างนี้
 https://image.nostr.build/fc973bc4a3c9dd9330fdd754461ac0f45c6cf031509a0815ddba10764a9588fd.png

เมื่อเราใช้ Merkle Tree มาช่วยจัดการการตรวจสอบธุรกรรมบนบิตคอยน์ ทำให้เราไม่จำเป็นต้องตรวจสอบทุกธุรกรรมในบล๊อก เนื่องจากเราสามารถเช็คเพียงแค่ root hash ว่าตรงกับคนอื่นมั้ย ถ้าตรงก็แปลว่าข้อมูลที่เรารับมาถูกต้อง ในทางกลับกันหากไม่ตรงเราสามารถไล่เช็คตามลำดับของ tree เพื่อตามหาธุรกรรมเจ้าปัญหาได้ง่ายกว่าการไล่เช็คทั้งหมด การนำ merkle tree มาใช้ช่วยให้ การตรวจสอบบล๊อกนั้นทำได้ง่ายขึ้นและใช้พื้นที่ในการเก็บข้อมูลน้อยลง

#siamstr


POW

การสร้างเซิร์ฟเวอร์บันทึกเวลาแบบกระจาย (Distributed Timestamp Server) ที่ทำงานแบบ peer-to-peer จะต้องอาศัยระบบ proof-of-work ซึ่งคล้ายกับ Hashcash ของ Adam Back

ระบบ proof-of-work ทำงานโดยการค้นหาค่า ๆ หนึ่งและเมื่อนำค่านั้นไปคำนวณ hash (เช่น SHA-256) ผลลัพธ์ (hash) จะต้องเริ่มต้นด้วยจำนวน bit ที่ได้กำหนดไว้ โดยความยากในการทำงาน (work) จะเพิ่มขึ้นแบบทวีคูณตามจำนวน bit ที่ต้องการ แต่ในการตรวจสอบความถูกต้องนั้นกับสามารถทำได้โดยการคำนวณ hash เพียงครั้งเดียว

โดยในระบบของบิตคอยน์จะมีการเพิ่มค่า nonce ลงไปในแต่ละบล๊อก จนกว่าจะพบค่าที่ทำให้ hash ของบล็อกเริ่มต้นด้วยจำนวน bit ที่กำหนดไว้ เมื่อใช้พลังประมวลผลเพื่อให้บล็อกสอดคล้องกับ proof-of-work แล้ว บล็อกนั้นจะไม่สามารถแก้ไขได้โดยไม่ต้องทำ proof-of-work ใหม่ เนื่องจากบล็อกใหม่ ๆ จะถูกเชื่อมโยงต่อกันหลังจากบล็อกนั้นแล้ว การแก้ไขบล็อกเดิมจะต้องทำ proof-of-work ใหม่สำหรับบล็อกนั้นและบล็อกทั้งหมดที่ตามมา นอกจากนี้ proof-of-work  ยังแก้ปัญหาการตัดสินใจแบบเสียงข้างมากด้วย  เพราะการตัดสินใจแบบเสียงข้างมากมักใช้ IP ในการนับโหวต ในระบบแบบนี้สามารถถูกโจมตีได้โดยบุคคลที่สามารถควบคุม IP address ได้ในจำนวนมาก แต่ proof-of-work เป็นเหมือนการใช้กำลังในการประมวลผลในการตัดสินใจแบบเสียงข้างมากจะแสดงโดย chain ที่ยาวที่สุดซึ่งมี proof-of-work ที่ถูกลงทุนไปมากที่สุด หากพลังประมวลผลของ majority เป็นของ node ที่ซื่อสัตย์ chain ของ node ที่ซื่อสัตย์จะเติบโตเร็วที่สุดและจะเหนือกว่า chain อื่น ๆ

เพื่อชดเชยความเร็วของฮาร์ดแวร์ที่เพิ่มขึ้นและความสนใจที่แตกต่างกันในการทำงานของ node และความยากของ proof-of-work จะถูกกำหนดโดยค่าเฉลี่ยทุก ๆ 2016 บล๊อก ซึ่งมีเป้าหมายที่จำนวนบล็อกต่อชั่วโมง หากบล็อกถูกสร้างขึ้นเร็วเกินไป ความยากจะเพิ่มขึ้น หากช้าไปก็จะง่ายขึ้นแทน โดยมีสมการในการปรับดังนี้ New Difficulty = Old Difficulty × (Actual Time / Target Time)

#siamstr


Nostr event

event บน nostr หรือก็คือ โน๊ตหรือข้อมูลต่าง ๆ ที่เราเห็นกันบน nostr ไม่ว่าจะเป็นข้อมูล profile, เนื้อหาบน note, long-form, หรือแม้แต่การไลฟ์ ล้วนแล้วแต่เป็น event ทั้งหมด โดย event จะมีหน้าตาประมาณนี้
{
  "id": ,
  "pubkey": ,
  "created_at": ,
  "kind": ,
  "tags": [ [...],[...] ],
  "content": ,
  "sig":
}

id ก็คือ event id ที่มักจะโชว์เวลาทำการโควทบางโน๊ตบน nostr คำนวณโดยการ นำข้อมูลส่วนอื่น ๆ ใน event (pubkey,create_at,kid,tg,content) มา Serialize จากนั้น hash ด้วย sha256
pubkey ก็คือ npubของเราแต่จะอยู่ในรูปของ hex
create_at ก็คือเวลาที่เราสร้างโน๊ต อยู่ในรูปของ unix timestamp ในวินาที
kind ก็คือเลขที่ใช้กำหนดประเภทของ event อยู่ในรูปของ int (0-65,535)
tag ก็คือ # ที่เราใส่ในโพสต์ต่าง ๆ
content ก็คือเนื้อหาที่อยู่บนโน๊ต
sig ก็คือ digital signature ของเรา ใช้เพื่อยืนยันว่า note นี้มาจาก nsec นั้น ๆ ที่เป็นเจ้าของ npub นั้น ๆ จริง ๆ คำนวณด้วยการใช้ ECDSA กับ serialized event data จาก id และ private key ของเรา

อย่างที่เห็นว่าทุกส่วนของ event ถูกเก็บในรูปของ text แล้ว เราสามารถเห็นรูปภาพหรือวิดีโอบน nostr ได้อย่างไร ?

ที่เราสามารถเห็นรูปภาพหรือวิดีโอบน client ต่าง ๆ ของ nostr ได้เนื่องจากการใช้ URL References
ถ้าเอาแบบเข้าใจง่าย ๆ ก็คือสิ่งที่เก็บบน event ของ nostr คือ url ที่ใช้ Markdown-style เพื่อทำ image embedding ขึ้นมา
#siamstr


Elliptical Curve Digital Signature Algorithm

ECDSA เป็นฟังก์ชันการเข้ารหัสแบบอสมมาตร (asymmetric cryptographic function) ซึ่งอยู่บนสมการ 𝑦² = 𝑥³ + 𝑎𝑥 + 𝑏
ซึ่งจุดเด่นของ Elliptic curve คือเมื่อลากเส้นผ่านสองจุดบนเส้นโค้ง จะมีจุดที่สามที่เส้นตัดผ่านเสมอ จึงเหมาะสมที่จะใช้เป็น ฟังก์ชันทางเดียว (เมล็ดกาแฟและผงกาแฟที่ยกตัวอย่างในโพสต์ก่อน) เนื่องจากมันสามารถที่จะสร้างจุดบนเส้นโค้งที่ไม่มีความสัมพัธ์ใด ๆ กับจุดเริ่มต้นของมันหลังจากทำซ้ำหลาย ๆ ครั้ง โดยบิตคอยน์ใช้ secp256k1 ซึ่งมีพารามิเตอร์ดังนี้
1. a และ b บนสมการเป็น 0 และ 7 ตามลำดับ
2. Prime modulo: 2²⁵⁶ - 2³² - 2⁹ - 2⁸ - 2⁷ - 2⁶ - 2⁴ - 1
3. base point p (บาง source ใช้ว่า Generator point) ในเลขฐาน 16: 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
4. ลำดับในเลขฐาน 16: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
* สุดท้ายแล้วสมการออกมาแบบนี้ 𝑦² = (𝑥³+7)over (F p)
* ซึ่งตัวเลขเหล่านี้ไม่ได้อุปโหลกขึ้นมามั่ว ๆ แต่เป็นเลขที่ได้มาตรฐานจาก SECG (The Standards for Efficient Cryptography Group)
อย่างที่กล่าวไว้โพสต์ก่อน private key นั้นมาจากการสุ่ม ส่วน public key นั้นมาจากการคำนวณตามสูตร
public key = private key * base point P
ซึ่งเป็นการทำ scalar multiplication และอย่างที่กล่าวไว้ข้างต้น base point P กำหนดโดย secp256k1และเป็นค่าเดียวกันสําหรับทุกคนที่สร้าง public key หมายความว่า private key หนึ่งอันผ่านสมการนี้ยังไงก็จะได้ public key เดิมเสมอ และเนื่องจากลักษณะของ Elliptic curve ที่เป็นฟังก์ชันที่ย้อนกลับไม่ได้ จึงทำให้ public key ไม่สามารถย้อนกลับไปเป็น private key ได้

#siamstr


Digital keys บนบิตคอยน์
บิตคอยน์ใช้ PKE ซึ่งเป็น asymmetric cryptography เพื่อที่จะสร้างคู่กุญแจขึ้นมา นั้นคือ public key และ private key โดยหากมี private key เราสามารถคำนวณเพื่อหา public key ได้ แต่ในทางกลับกันการมี public key เพียงอย่างเดียวนั้นไม่สามารถย้อนกลับไปหา private key ได้ ถ้าจะให้เห็นภาพง่าย ๆ ลองจินตนาการถึง เมล็ดกาแฟกับผงกาแฟ โดยให้ private key เปรียบเสมือน เมล็ดกาแฟและให้ public key เป็นผงกาแฟ เราสามารถนำเมล็ดกาแฟมาบดเพื่อให้ได้ผงกาแฟเสมอ แต่ในทางกลับกันเราไม่สามารถนำผงกาแฟมาประกอบกับเป็นเมล็ดกาแฟได้ แล้วกุญแจทั้งสองสร้างอย่างไร ?
Private key นั้นสร้างโดยการสุ่มตัวเลข ซึ่งเป็นเลขฐาน 16 จำนวน 64 ตำแหน่ง จึงแทบจะเป็นไปไม่ได้เลยที่จะมีคนที่เผลอสร้าง private key แล้วจะออกมาซ้ำกัน เนื่องจาก private key นั้นมีความเป็นไปได้ถึง 16^64 หรือ 2^256 ซึ่งเท่ากับ 115,792,089,237,316,195,423,570,985,008,690,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 หรือ 115 * 10^75 ความเป็นไปได้ ใครคิดจะ random เพื่อหาบิตคอยน์ก็สู้ ๆ นะครับผมเป็นกำลังใจให้
Public key สร้างโดยการใช้ private key ของเราไปผ่าน ECDSA (Elliptical Curve Digital Signature Algorithm)
แล้วกุญแจทั้งสองในบิตคอยน์นั้นสามารถทำอะไรได้บ้าง
Public key: มีหน้าที่สำคัญ ๆ อยู่สองอย่าง นั้นคือการสร้าง bitcoin address โดยการนำ public key ไป hash, ใช้เพื่อยืนยันธุรกรรมของบิตคอยน์ (ทั้งสองกระบวนการที่กล่าวมานั้นไม่จำเป็นต้องใช้ private key)
Private key: เป็นส่วนสำคัญในการทำธุรกรรมของบิตคอยน์เนื่องจากทุกธุรกรรมบนบิตคอยน์จำเป็นต้องมี digital signature เพื่อยืนยันว่าคุณเป็นเจ้าของบิตคอยน์นั้นจริง ๆ
* ที่สำคัญเลยคือ private คือของบิตคอยน์นั้นคุณควรเก็บไว้ให้ดีอย่าให้ใครรู้ เนื่องจากหากมีบุคคลอื่นรู้ถึง private key ของคุณ วกเขาก็จะสามารถสร้างธุรกรรมบิตคอยน์ด้วย digital signature ของคุณได้ (เขาจะขโมยบิตคอยน์ของคุณได้!!)