4. Proof-of-Work ในการสร้าง Timestamp Server แบบกระจายศูนย์บนพื้นฐานแบบ peer to peer เราจำเป็นต้องใช้ระบบ Proof-of-Work (PoW) ที่คล้ายกับ Hashcash ของ Adam Back [6] แทนที่จะใช้วิธีการแบบเดิม ๆ อย่างการประกาศในหนังสือพิมพ์หรือ Usenet โดย PoW ใช้ในการตรวจสอบค่าที่มาจากกระบวนการ hash เช่น SHA-256 แล้ว ผลลัพธ์ที่ได้ (Hash) จะขึ้นต้นด้วยเลขศูนย์จำนวนหนึ่ง โดยที่ work (ประมาณว่าพลังประมวลผล) ที่ต้องใช้จะเพิ่มขึ้นแบบทวีคูณตามจำนวนเลขศูนย์ที่ต้องการ และสามารถตรวจสอบได้โดยการรัน Hash เพียงครั้งเดียว ซึ่งสำหรับ timestamp network ของเรานั้น เราใช้ PoW โดยการเพิ่มค่า Nonce ในบล็อกไปเรื่อย ๆ จนกว่าจะพบค่าที่ทำให้ Hash ของบล็อกนั้นมีเลขศูนย์ตามที่กำหนด และเมื่อใช้กำลังประมวลผลของ CPU ไปกับการทำ PoW จนสำเร็จแล้ว บล็อกจะไม่สามารถเปลี่ยนแปลงได้ หากไม่มีการทำงานซ้ำใหม่ เนื่องจากบล็อกที่สร้างขึ้นภายหลังจะเชื่อมโยงกับบล็อกก่อนหน้า การเปลี่ยนแปลงบล็อกใด ๆ จะต้องทำ PoW ของบล็อกนั้นและบล็อกที่ตามมาใหม่ทั้งหมด image นอกจากนี้ PoW ยังช่วยแก้ปัญหาของเสียงส่วนมากที่มาตัดสินใจในระบบนี้ เพราะหากเสียงข้างมากอ้างอิงจากหลักการหนึ่ง IP หนึ่งเสียง ใครก็ตามที่สามารถสร้าง IP ได้จำนวนมากก็จะสามารถควบคุมระบบได้ จึงใช้หลักการหนึ่ง CPU หนึ่งเสียงแทน การตัดสินใจของเสียงข้างมากจะแสดงด้วย Chain ที่ยาวที่สุด ซึ่งบ่งบอกถึงความพยายามในการคำนวณ (Proof-of-Work) ที่มากที่สุด หาก Node ที่ซื่อสัตย์ (Honest nodes) มีกำลังประมวลผลของ CPU ส่วนใหญ่อยู่ในการควบคุม Honest Chain ก็จะเติบโตเร็วที่สุดและแซงหน้า Chain อื่น ๆ ได้ ผู้โจมตีที่ต้องการแก้ไขบล็อกในอดีตจะต้องทำ Proof-of-Work ของบล็อกนั้นและบล็อกที่ตามมาใหม่ทั้งหมด และต้องทำงานให้เร็วกว่า Honest Node ด้วย ซึ่งโอกาสที่ผู้โจมตีจะตามทันนั้นจะลดลงแบบทวีคูณเมื่อมีการเพิ่มบล็อกมากขึ้น เพื่อชดเชยความเร็วของฮาร์ดแวร์ที่เพิ่มขึ้นและความสนใจในการรัน Node ที่ผันผวน ระดับความยากของ Proof-of-Work จะถูกกำหนดโดยค่าเฉลี่ย โดยตั้งเป้าไว้ที่จำนวนบล็อกเฉลี่ยต่อชั่วโมง หากสร้างบล็อกได้เร็วเกินไป ระดับความยากก็จะเพิ่มขึ้น [6] A. Back, "Hashcash - a denial of service counter-measure," 📄.pdf , 2002. #siamstr
มาสร้าง emoji ของเราบน nostr กันเถอะ!! ครั้งนี้จะเป็นการสร้าง emoji list ผ่านทาง nostrudel เนื่องจากเป็น client ที่เป็นที่นิยมและคิดว่าหลาย ๆ คนน่าจะเคยใช้งานกันมาบ้างแล้ว 1. ให้ไปที่ส่วนของ other stuff จากนั้นเลือก more แล้วเราจะเจอหน้าตาประมาณนี้ (รูปที่ 1) image 2. กดเข้าไปในหัวข้อ emoji จากนั้นเลือก create new pack บนมุมบนขวา (รูปที่ 2) image 3. หลังใส่ชื่อเรียบร้อยเราจะเข้าสู่หน้านี้ (รูปที่ 3) image 4. เมื่อเรากด edit ที่มุมบนขวาเราก็จะได้ช่องที่ใส่ชื่อของอิโมจิตัวนั้น ๆ และช่องใส่ url ของรูปภาพหรือ gif มา (รูปที่ 4) image 5. หลังใส่รายละเอียดแล้วให้เรากด add และทำวนไปเรื่อย ๆ จนกว่าจะพอใจ หลังจากนั้นให้เรากด save และทำการ sign ธุรกรรมนั้นก็เป็นอันเสร็จสิ้น เพียงเท่านี้เราก็จะมีอิโมจิของเราที่ไม่เหมือนใครเอาไว้ใช้แล้ว
Emoji บน Nostr บน nostr นั้นการกด reaction (kind 7) ในแต่ละโพสต์นั้นค่อนข้างแตกต่างกับโซเชียลมีเดียอื่น ๆ เป็นอย่างมากเนื่องจากผู้ใช้ทุกคนสามารถที่จะออกแบบและเลือกใช้อิโมจิอะไรก็ได้ที่ตัวผู้ใช้นั้น ๆ ต้องการ โดย emoji จะถูกเก็บอยู่ในลักษณะของ list (NIP-51) เหมือนกับพวก following list, mute list แต่การใช้งานจริง ๆ ทำได้หลากหลายมากกว่านั้น เช่นการจับลง kind 0 หรือ kind 1 ก็สามารถทำได้เช่นกัน ทีนี้เรามาลองดูโครงสร้าง event ของ list emoji กันดีกว่า { "id": "c25122084feb5b70c4c141c515e91dfb6a65c494dae2baf091839ff88a4cc0c3", "pubkey": "66df60562d939ada8612436489945a4ecf1d62346b3d9478dea8a338f3203c64", "created_at": 1710736175, "kind": 30030, "tags": [ [ "d", "ชื่อเซตอิโมจิ"], ["emoji","ชื่อสั้น ๆ ","httpรูปหรือ gif"], [ "emoji","ชื่อสั้น ๆ ""httpรูปหรือ gif"], ["emoji","ชื่อสั้น ๆ ","httpรูปหรือ gif"], [ "emoji","ชื่อสั้น ๆ ""httpรูปหรือ gif"], "content": "", "sig": "c4fb0626619fc0881d859570d0d00d72f7a429aca53a322768a6a0c69ddb00e44a87b65bf75a07eb7647407b78803f76720e22eed0724d554470d30371ab1173" } อย่างที่เห็นว่าจุดแตกต่างของ event ที่ทำให้ client ต่าง ๆ รู้ว่ามันคืออีโมจิคือ tag "d"(identifier) และ "emoji" และต้องมีโครงสร้างดังนี้ ["emoji", <shortcode>, <image-url>] เมื่อทำการเผยแพร่ event ในลักษณะนี้แล้วเราก็จะได้ list ของอิโมจิออกมาแบบนี้ View Event → ส่วนถ้าเราต้องการนำ emoji ที่เราสร้างไปใส่ในหน้าโปรไฟล์หรือเวลาเราโพสต์เราต้องทำอย่างไร ? โปรไฟล์(kind 0) { "kind": 0, "content": "{\"name\":\"Alex Gleason :soapbox:\"}", "tags": [ ["emoji", "soapbox", "http s://gleasonator.com/emoji/Gleasonator/soapbox.png"] ], "pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6", "created_at": 1682790000 } ใน part ของโปรไฟล์นั้นเพียงแค่เราเพิ่ม shortcode ลงไปในจุดที่เราต้องการใส่และทำการเพิ่ม emoji ใน tag ก็สามารถใช้ได้แล้ว และในทำนองเดียวกันสำหรับการโพสต์ (kind 1) { "kind": 1, "content": "Hello :gleasonator: 😂 :ablobcatrainbow: :disputed: yolo", "tags": [ ["emoji", "ablobcatrainbow", "https: //gleasonator.com/emoji/blobcat/ablobcatrainbow.png"], ["emoji", "disputed", "https: //gleasonator.com/emoji/Fun/disputed.png"], ["emoji", "gleasonator", "https: //gleasonator.com/emoji/Gleasonator/gleasonator.png"] ], "pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6", "created_at": 1682630000 } และประเภทสุดท้ายของการใช้ emoji บน nostr และหน้าจะเป็นประเภทที่หลาย ๆ คนใช้กันมากที่สุดอย่างการกด reaction ด้วย emoji จะมี event หน้าตาประมาณนี้ { "kind": 7, "content": ":soapbox:", "tags": [ ["emoji", "soapbox", "https ://gleasonator.com/emoji/Gleasonator/soapbox.png"] ], ...other fields } ทั้งหมดนี้คือวิธีการใช้อิโมจิต่าง ๆ บน nostr ซึ่งจัดเป็นอีกฟังก์ชั่นที่น่าสนใจมาก ๆ ในการเพิ่มสีสันให้สังคม nostr โดยในปัจจุบันมีหลาย ๆ client ได้รองรับการใช้ custom emoji เหล่านี้แล้วส่วนวิธีการสร้างแบบง่าย ๆ โดยที่ไม่ต้องสนใจสิ่งที่กล่าวมาข้างต้นนั้นสามารถทำได้บน emojito.meme หรือ Nostrudel ได้เลย #siamstr
Bitcoin node บิตคอยน์โหนด หรือก็คือเหล่าบรรดาคุณป้าข้างบ้านที่มีปัญญาในการจดจำอันเลิศล้ำและคอยบอกต่อเรื่องราวต่าง ๆ ที่เขารับรู้มาให้เราเสมอไม่ว่าจะเรื่องราวของข้างบ้าน ข้างหมู่บ้าน ลูก หลาน เหลน ได้อย่างไม่เหน็ดเหนื่อย โอเคกับมาเข้าเรื่องก่อน บิตคอยน์โหนดคือโปรแกรมที่ทำหน้าที่ในการตรวจสอบธุรกรรม หากถูกต้องตามกฎและระเบียบที่แต่ละโหนดกำหนดไว้ โหนดก็จะส่งธุรกรรมและบล๊อกที่ได้รับนั้นไปยังโหนดอื่น ๆ และเก็บสำรองข้อมูลเหล่านั้นไว้เพื่ออ้างอิงในอนาคตด้วย แล้วมันทำงานยังไง ? เมื่อธุรกรรมใหม่ถูกสร้างและส่งต่อในเครือข่าย, บิตคอยน์โหนดจะรับธุรกรรมเหล่านั้นและทำการตรวจสอบตามกฎที่โหนดนั้น ๆ เลือก เช่น ตรวจสอบลายเซ็นดิจิทัลและตรวจสอบ unspent transaction outputs (UTXOs) โดยโหนดจะใช้ BIP ต่าง ๆ เป็นตัวช่วยในการตรวจสอบ เช่น BIP-66 เพื่อการตรวจสอบ digital signature หลังจากการตรวจสอบความถูกต้องของธุรกรรม, บิตคอยน์จะรวมธุรกรรมที่ตรวจสอบแล้วเหล่านี้เข้าไปใน mempool ซึ่งเป็นพื้นที่เก็บข้อมูลของธุรกรรมที่รอการบรรจุลงในบล็อกถัดไป โหนดจะคอยตรวจสอบบล็อกใหม่ที่เผยแพร่จาก miner ซึ่งจะมีการยืนยันบล็อกใหม่เหล่านี้โดยการตรวจสอบลำดับของบล็อกและการตรวจสอบปัญหาต่าง ๆ เช่น มี double-spending มั้ย, มีธุรกรรมที่ out มากกว่า in มั้ย เมื่อโหนดยืนยันบล็อกใหม่แล้ว, บล็อกดังกล่าวจะถูกเพิ่มลงใน blockchain และโหนดจะเผยแพร่ข้อมูลบล็อกใหม่ไปยังโหนดอื่น ๆ ในเครือข่าย เพื่อให้ข้อมูลนี้ถูกกระจายออกไปทั่วเครือข่าย #siamstr