หนังสือ “การสร้างสัญญาอัจฉริยะที่แข็งแกร่งสำหรับ Ethereum blockchain คู่มือปฏิบัติ"

หนังสือ “การสร้างสัญญาอัจฉริยะที่แข็งแกร่งสำหรับ Ethereum blockchain คู่มือปฏิบัติ"
เป็นเวลากว่าหนึ่งปีแล้วที่ฉันได้ทำงานกับหนังสือ “การสร้างสัญญาอัจฉริยะที่แข็งแกร่งสำหรับ Ethereum Blockchain” คู่มือปฏิบัติ" และบัดนี้ผลงานทั้งเล่มและเล่มนี้ก็ได้เสร็จสมบูรณ์แล้ว เผยแพร่และมีจำหน่ายเป็นลิตร.

ฉันหวังว่าหนังสือของฉันจะช่วยให้คุณเริ่มต้นสร้าง Solidity smart contacts และแจกจ่าย DApps สำหรับ Ethereum blockchain ได้อย่างรวดเร็ว ประกอบด้วย 12 บทเรียนพร้อมแบบฝึกหัด เมื่อเสร็จสิ้นแล้ว ผู้อ่านจะสามารถสร้างโหนด Ethereum ในพื้นที่ของตนเอง เผยแพร่สัญญาอัจฉริยะและเรียกใช้วิธีการของพวกเขา แลกเปลี่ยนข้อมูลระหว่างโลกแห่งความเป็นจริงและสัญญาอัจฉริยะโดยใช้ออราเคิล และทำงานร่วมกับเครือข่ายแก้ไขจุดบกพร่องการทดสอบ Rinkeby

หนังสือเล่มนี้ส่งถึงผู้ที่สนใจในเทคโนโลยีขั้นสูงในด้านบล็อกเชน และต้องการรับความรู้อย่างรวดเร็ว ซึ่งช่วยให้พวกเขามีส่วนร่วมในงานที่น่าสนใจและมีแนวโน้ม

ด้านล่างนี้คุณจะพบสารบัญและบทแรกของหนังสือ (รวมถึง ลิตร มีเศษหนังสืออยู่) ฉันหวังว่าจะได้รับข้อเสนอแนะความคิดเห็นและข้อเสนอแนะ ฉันจะพยายามคำนึงถึงทั้งหมดนี้เมื่อเตรียมหนังสือฉบับหน้า

สารบัญการแนะนำหนังสือของเรามีไว้สำหรับผู้ที่ต้องการไม่เพียงแต่ต้องการเข้าใจหลักการของ Ethereum blockchain เท่านั้น แต่ยังต้องการได้รับทักษะเชิงปฏิบัติในการสร้าง DApps แบบกระจายในภาษาการเขียนโปรแกรม Solidity สำหรับเครือข่ายนี้

เป็นการดีกว่าไม่เพียงแค่อ่านหนังสือเล่มนี้เท่านั้น แต่ยังดีกว่าที่จะทำงานกับมันโดยปฏิบัติงานภาคปฏิบัติที่อธิบายไว้ในบทเรียน ในการทำงาน คุณจะต้องมีคอมพิวเตอร์ในระบบ เซิร์ฟเวอร์เสมือนหรือคลาวด์ที่ติดตั้ง Debian หรือ Ubuntu OS คุณยังสามารถใช้ Raspberry Pi เพื่อทำงานหลายอย่างได้

ในบทเรียนแรก เราจะดูหลักการทำงานของบล็อคเชน Ethereum และคำศัพท์พื้นฐาน และยังพูดถึงว่าบล็อคเชนนี้สามารถใช้งานได้ที่ไหน

เป้า บทเรียนที่สอง — สร้างโหนดบล็อกเชน Ethereum ส่วนตัวสำหรับการทำงานเพิ่มเติมภายในหลักสูตรนี้บนเซิร์ฟเวอร์ Ubuntu และ Debian เราจะดูคุณสมบัติของการติดตั้งยูทิลิตี้พื้นฐาน เช่น geth ซึ่งช่วยให้มั่นใจถึงการทำงานของโหนด blockchain ของเรา เช่นเดียวกับ daemon การจัดเก็บข้อมูลแบบกระจายอำนาจแบบกลุ่ม

บทเรียนที่สาม จะสอนวิธีทดลองใช้ Ethereum บนไมโครคอมพิวเตอร์ Raspberry Pi ราคาไม่แพง คุณจะติดตั้งระบบปฏิบัติการ (OS) Rasberian บน Raspberry Pi ซึ่งเป็นยูทิลิตี้ Geth ที่ขับเคลื่อนโหนดบล็อกเชน และ Swarm ดีมอนการจัดเก็บข้อมูลแบบกระจายอำนาจ

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

ในบทเรียนที่ห้า คุณจะได้ทำความคุ้นเคยกับสัญญาอัจฉริยะบนเครือข่าย Ethereum และเรียนรู้เกี่ยวกับการดำเนินการโดยเครื่องเสมือน Ethereum

คุณจะสร้างและเผยแพร่สัญญาอัจฉริยะฉบับแรกของคุณบนเครือข่ายส่วนตัว Ethereum และเรียนรู้วิธีเรียกใช้ฟังก์ชันต่างๆ เมื่อต้องการทำเช่นนี้ คุณจะใช้ Remix Solidity IDE คุณจะได้เรียนรู้วิธีการติดตั้งและใช้คอมไพลเลอร์ชุด solc
เราจะพูดถึงสิ่งที่เรียกว่า Application Binary Interface (ABI) และสอนวิธีใช้งานให้คุณ

บทเรียนที่หก ทุ่มเทให้กับการสร้างสคริปต์ JavaScript ที่ใช้ Node.js และดำเนินการกับสัญญาอัจฉริยะ Solidity

คุณจะติดตั้ง Node.js บน Ubuntu, Debian และ Rasberian OS เขียนสคริปต์เพื่อเผยแพร่สัญญาอัจฉริยะบนเครือข่ายท้องถิ่น Ethereum และเรียกใช้ฟังก์ชันต่างๆ

นอกจากนี้ คุณจะได้เรียนรู้วิธีโอนเงินระหว่างบัญชีปกติโดยใช้สคริปต์ ตลอดจนให้เครดิตเข้าบัญชีสัญญาอัจฉริยะ

ในบทเรียนที่เจ็ด คุณจะได้เรียนรู้วิธีการติดตั้งและใช้เฟรมเวิร์ก Truffle ซึ่งเป็นที่นิยมในหมู่นักพัฒนาสัญญาอัจฉริยะ Solidity คุณจะได้เรียนรู้วิธีสร้างสคริปต์ JavaScript ที่เรียกใช้ฟังก์ชันสัญญาโดยใช้โมดูลสัญญาทรัฟเฟิล และทดสอบสัญญาอัจฉริยะของคุณโดยใช้ทรัฟเฟิล

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

ในบทเรียนที่เก้า คุณจะเข้าใกล้การสร้างสัญญาอัจฉริยะสำหรับเครือข่ายหลัก Ethereum ไปอีกขั้นหนึ่ง คุณจะได้เรียนรู้วิธีเผยแพร่สัญญาโดยใช้ Truffle บนเครือข่ายส่วนตัวของ Geth รวมถึงบน Rinkeby testnet การดีบักสัญญาอัจฉริยะบนเครือข่าย Rinkeby นั้นมีประโยชน์มากก่อนที่จะเผยแพร่บนเครือข่ายหลัก - เกือบทุกอย่างเป็นจริงที่นั่น แต่ฟรี

ในส่วนหนึ่งของบทเรียน คุณจะสร้างโหนดเครือข่ายทดสอบ Rinkeby จัดหาเงินทุน และเผยแพร่สัญญาอัจฉริยะ

บทที่ 10 ทุ่มเทให้กับการจัดเก็บข้อมูลแบบกระจาย Ethereum Swarm ด้วยการใช้พื้นที่เก็บข้อมูลแบบกระจาย คุณจะประหยัดในการจัดเก็บข้อมูลจำนวนมากบนบล็อกเชน Ethereum

ในบทช่วยสอนนี้ คุณจะสร้างพื้นที่จัดเก็บ Swarm ในเครื่อง การดำเนินการเขียนและอ่านไฟล์ และไดเร็กทอรีไฟล์ ถัดไป คุณจะได้เรียนรู้วิธีทำงานกับเกตเวย์ Swarm สาธารณะ เขียนสคริปต์เพื่อเข้าถึง Swarm จาก Node.js รวมถึงการใช้โมดูล Perl Net::Ethereum::Swarm

วัตถุประสงค์บทเรียน 11 — เชี่ยวชาญการทำงานกับสัญญาอัจฉริยะ Solidity โดยใช้ภาษาการเขียนโปรแกรม Python ยอดนิยมและเฟรมเวิร์ก Web3.py คุณจะติดตั้งเฟรมเวิร์ก เขียนสคริปต์เพื่อคอมไพล์และเผยแพร่สัญญาอัจฉริยะ และเรียกใช้ฟังก์ชันต่างๆ ในกรณีนี้ Web3.py จะถูกใช้ทั้งในตัวมันเองและร่วมกับสภาพแวดล้อมการพัฒนาแบบรวม Truffle

ในบทเรียนที่ 12 คุณจะได้เรียนรู้การถ่ายโอนข้อมูลระหว่างสัญญาอัจฉริยะและโลกแห่งความเป็นจริงโดยใช้ Oracle ซึ่งจะเป็นประโยชน์สำหรับคุณในการรับข้อมูลจากเว็บไซต์ อุปกรณ์ IoT อุปกรณ์และเซ็นเซอร์ต่างๆ และส่งข้อมูลจากสัญญาอัจฉริยะไปยังอุปกรณ์เหล่านี้ ในภาคปฏิบัติของบทเรียน คุณจะสร้างออราเคิลและสัญญาอัจฉริยะที่ได้รับอัตราแลกเปลี่ยนปัจจุบันระหว่าง USD และรูเบิลจากเว็บไซต์ของธนาคารกลางแห่งสหพันธรัฐรัสเซีย

บทที่ 1 สั้นๆ เกี่ยวกับบล็อกเชนและเครือข่าย Ethereumจุดประสงค์ของบทเรียน: ทำความคุ้นเคยกับหลักการทำงานของ Ethereum blockchain ขอบเขตการใช้งาน และคำศัพท์พื้นฐาน
งานภาคปฏิบัติ: ไม่ครอบคลุมอยู่ในบทเรียนนี้

แทบจะไม่มีนักพัฒนาซอฟต์แวร์ในปัจจุบันที่ไม่เคยได้ยินอะไรเกี่ยวกับเทคโนโลยีบล็อกเชน (Blockchain), สกุลเงินดิจิทัล (Cryptocurrency หรือสกุลเงิน Crypto), Bitcoin (Bitcoin), การเสนอเหรียญเริ่มต้น (ICO, การเสนอเหรียญเริ่มต้น), สัญญาอัจฉริยะ (สัญญาอัจฉริยะ) รวมถึงแนวคิดและคำศัพท์อื่นๆ ที่เกี่ยวข้องกับบล็อคเชน

เทคโนโลยีบล็อคเชนเปิดตลาดใหม่และสร้างงานให้กับโปรแกรมเมอร์ หากคุณเข้าใจความซับซ้อนทั้งหมดของเทคโนโลยีสกุลเงินดิจิทัลและเทคโนโลยีสัญญาอัจฉริยะ คุณไม่ควรมีปัญหาในการนำความรู้นี้ไปใช้ในทางปฏิบัติ

ต้องบอกว่ามีการเก็งกำไรมากมายเกี่ยวกับสกุลเงินดิจิทัลและบล็อกเชน เราจะทิ้งการอภิปรายเกี่ยวกับการเปลี่ยนแปลงของอัตราสกุลเงินดิจิทัล การสร้างปิรามิด ความซับซ้อนของกฎหมายสกุลเงินดิจิทัล เป็นต้น ในหลักสูตรการฝึกอบรมของเรา เราจะมุ่งเน้นไปที่ด้านเทคนิคของการประยุกต์ใช้สัญญาอัจฉริยะของ Ethereum blockchain (Ethereum, Ether) และการพัฒนาสิ่งที่เรียกว่าแอปพลิเคชันแบบกระจายอำนาจ (Distributed Application, DApp)

blockchain คืออะไร

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

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

ฐานข้อมูลแบบกระจาย

บล็อกเชนถือได้ว่าเป็นฐานข้อมูลแบบกระจายที่ถูกจำลองแบบข้ามโหนดทั้งหมดของเครือข่ายบล็อกเชน ตามทฤษฎีแล้ว บล็อกเชนจะทำงานได้ตราบเท่าที่อย่างน้อยหนึ่งโหนดยังทำงานอยู่ โดยจะจัดเก็บบล็อกทั้งหมดของบล็อกเชน

Registry ข้อมูลแบบกระจาย

Blockchain ถือได้ว่าเป็นบัญชีแยกประเภทแบบกระจายข้อมูลและการดำเนินงาน (ธุรกรรม) ชื่ออื่นสำหรับการลงทะเบียนดังกล่าวคือบัญชีแยกประเภท

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

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

การทำธุรกรรม

Blockchain จัดเก็บข้อมูลเกี่ยวกับการดำเนินงาน (ธุรกรรม) ไว้ในบล็อก ในเวลาเดียวกัน ธุรกรรมเก่าที่เสร็จสมบูรณ์แล้วไม่สามารถย้อนกลับหรือเปลี่ยนแปลงได้ ธุรกรรมใหม่จะถูกจัดเก็บไว้ในบล็อกใหม่ที่เพิ่มเข้ามา

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

Ethereum blockchain มีสิ่งที่เรียกว่าสถานะของระบบ ขณะที่ธุรกรรมถูกดำเนินการ สถานะจะเปลี่ยนจากสถานะเริ่มต้นเป็นสถานะปัจจุบัน ธุรกรรมจะถูกบันทึกเป็นบล็อก

บล็อกเชนสาธารณะและส่วนตัว

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

การใช้งานจริงของบล็อคเชน

Blockchain มีประโยชน์อย่างไร?

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

แน่นอน คุณทราบดีว่าระบบสกุลเงินดิจิตอลกำลังถูกสร้างขึ้นบนพื้นฐานของบล็อกเชน ซึ่งได้รับการออกแบบมาเพื่อแทนที่เงินกระดาษธรรมดา เงินกระดาษเรียกอีกอย่างว่า fiat (จาก Fiat Money)
บล็อคเชนทำให้มั่นใจในการจัดเก็บและการเปลี่ยนแปลงไม่ได้ของธุรกรรมที่บันทึกไว้ในบล็อก ซึ่งเป็นเหตุผลว่าทำไมจึงสามารถใช้เพื่อสร้างระบบสกุลเงินดิจิทัลได้ มันมีประวัติทั้งหมดของการโอนเงิน crypto ระหว่างผู้ใช้ที่แตกต่างกัน (บัญชี) และสามารถติดตามการดำเนินการใด ๆ ได้

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

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

Ethereum blockchain และ Ethereum smart Contract ที่เขียนด้วยภาษาโปรแกรม Solidity สามารถนำมาใช้ได้ เช่น ในพื้นที่ต่อไปนี้:

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

ปัญหาเกี่ยวกับบล็อคเชน

แต่แน่นอนว่าไม่ใช่ทุกอย่างจะง่ายอย่างที่คิด!

มีปัญหาในการตรวจสอบข้อมูลก่อนเพิ่มลงในบล็อคเชน (เช่น เป็นของปลอมหรือเปล่า) ปัญหาเกี่ยวกับความปลอดภัยของระบบและแอพพลิเคชั่นซอฟต์แวร์ที่ใช้ในการทำงานกับบล็อคเชน ปัญหาเกี่ยวกับความเป็นไปได้ในการใช้วิธีวิศวกรรมสังคมเพื่อขโมยการเข้าถึง ไปยังกระเป๋าเงินดิจิตอล ฯลฯ .P.

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

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

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

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

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

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

ห่วงโซ่บล็อกเชนเกิดขึ้นได้อย่างไร

ดังที่เราได้กล่าวไปแล้ว blockchain นั้นเป็นสายโซ่ของบล็อกข้อมูลที่เรียบง่าย ขั้นแรกให้สร้างบล็อกแรกของห่วงโซ่นี้จากนั้นจึงเพิ่มบล็อกที่สองเข้าไปและต่อไปเรื่อย ๆ ข้อมูลธุรกรรมจะถือว่าถูกจัดเก็บไว้ในบล็อก และจะถูกเพิ่มลงในบล็อกล่าสุด

ในรูป 1.1 เราได้แสดงลำดับบล็อกที่ง่ายที่สุด โดยที่บล็อกแรกอ้างอิงถึงบล็อกถัดไป

หนังสือ “การสร้างสัญญาอัจฉริยะที่แข็งแกร่งสำหรับ Ethereum blockchain คู่มือปฏิบัติ"
ข้าว. 1.1. ลำดับบล็อกอย่างง่าย

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

มาเริ่มปกป้องบล็อกจากการปลอมแปลงกันดีกว่า ในขั้นแรก เราจะพยายามป้องกันแต่ละบล็อกด้วยเช็คซัม (รูปที่ 1.2)

หนังสือ “การสร้างสัญญาอัจฉริยะที่แข็งแกร่งสำหรับ Ethereum blockchain คู่มือปฏิบัติ"
ข้าว. 1.2. การเพิ่มการป้องกันสำหรับบล็อกเหล่านี้ด้วยเช็คซัม

ขณะนี้ผู้โจมตีไม่สามารถเปลี่ยนบล็อกได้ง่ายๆ เนื่องจากมีการตรวจสอบข้อมูลบล็อกอยู่ การตรวจสอบผลรวมจะแสดงว่าข้อมูลมีการเปลี่ยนแปลง

ในการคำนวณเช็คซัม คุณสามารถใช้ฟังก์ชันแฮชอย่างใดอย่างหนึ่ง เช่น MD-5, SHA-1, SHA-256 เป็นต้น ฟังก์ชันแฮชคำนวณค่า (เช่น สตริงข้อความที่มีความยาวคงที่) โดยการดำเนินการกับบล็อกข้อมูลที่ไม่สามารถย้อนกลับได้ การดำเนินการขึ้นอยู่กับประเภทของฟังก์ชันแฮช

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

ความคุ้มครองดังกล่าวจะเพียงพอหรือไม่? น่าเสียดายที่ไม่มี

ในรูปแบบนี้ เช็คซัม (ฟังก์ชันแฮช) จะปกป้องเฉพาะบล็อกแต่ละบล็อกเท่านั้น ไม่ใช่บล็อกเชนทั้งหมด เมื่อรู้อัลกอริทึมในการคำนวณฟังก์ชันแฮชแล้ว ผู้โจมตีสามารถแทนที่เนื้อหาของบล็อกได้อย่างง่ายดาย นอกจากนี้ไม่มีอะไรจะขัดขวางไม่ให้เขาถอดบล็อกออกจากโซ่หรือเพิ่มอันใหม่

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

หนังสือ “การสร้างสัญญาอัจฉริยะที่แข็งแกร่งสำหรับ Ethereum blockchain คู่มือปฏิบัติ"
ข้าว. 1.3. เพิ่มแฮชของบล็อกก่อนหน้าลงในบล็อกข้อมูล

ในรูปแบบนี้ เพื่อเปลี่ยนบล็อก คุณต้องคำนวณฟังก์ชันแฮชของบล็อกที่ตามมาทั้งหมดใหม่ ดูเหมือนว่าปัญหาคืออะไร?

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

ให้เราจำไว้ว่าข้อมูลบล็อกเชนถูกจัดเก็บ (ซ้ำ) บนโหนดเครือข่ายจำนวนมาก เช่น ใช้พื้นที่เก็บข้อมูลแบบกระจายอำนาจ และนี่ทำให้การปลอมแปลงบล็อกยากขึ้นมากเพราะว่า ต้องทำการเปลี่ยนแปลงกับโหนดเครือข่ายทั้งหมด

เนื่องจากบล็อกเก็บข้อมูลเกี่ยวกับบล็อกก่อนหน้า จึงสามารถตรวจสอบเนื้อหาของบล็อกทั้งหมดในห่วงโซ่ได้

อีเธอเรียมบล็อคเชน

Ethereum blockchain เป็นแพลตฟอร์มที่สามารถสร้าง DApps แบบกระจายได้ แตกต่างจากแพลตฟอร์มอื่น ๆ Ethereum อนุญาตให้ใช้สิ่งที่เรียกว่าสัญญาอัจฉริยะ (สัญญาอัจฉริยะ) ซึ่งเขียนด้วยภาษาโปรแกรม Solidity

แพลตฟอร์มนี้สร้างขึ้นในปี 2013 โดย Vitalik Buterin ผู้ก่อตั้งนิตยสาร Bitcoin และเปิดตัวในปี 2015 ทุกสิ่งที่เราจะศึกษาหรือทำในหลักสูตรการฝึกอบรมของเราเกี่ยวข้องโดยเฉพาะกับ Ethereum blockchain และ Solidity smart Contract

การขุดหรือวิธีการสร้างบล็อก

การขุดเป็นกระบวนการที่ค่อนข้างซับซ้อนและต้องใช้ทรัพยากรมากในการเพิ่มบล็อกใหม่ให้กับห่วงโซ่บล็อกเชน และไม่ใช่ "การขุดสกุลเงินดิจิทัล" เลย การขุดทำให้มั่นใจในการทำงานของบล็อคเชนเพราะว่า เป็นกระบวนการที่รับผิดชอบในการเพิ่มธุรกรรมไปยัง Ethereum blockchain

บุคคลและองค์กรที่เกี่ยวข้องกับการเพิ่มบล็อกเรียกว่าคนงานเหมือง
ซอฟต์แวร์ที่ทำงานบนโหนดคนงานเหมืองพยายามค้นหาพารามิเตอร์การแฮชที่เรียกว่า Nonce สำหรับบล็อกสุดท้ายเพื่อรับค่าแฮชเฉพาะที่ระบุโดยเครือข่าย อัลกอริธึมการแฮชของ Ethash ที่ใช้ใน Ethereum ช่วยให้คุณรับค่า Nonce ผ่านการค้นหาตามลำดับเท่านั้น

หากโหนดคนงานเหมืองพบค่า Nonce ที่ถูกต้อง นี่คือสิ่งที่เรียกว่า Proof of Work (PoW, Proof-of-work) ในกรณีนี้ หากมีการเพิ่มบล็อกในเครือข่าย Ethereum นักขุดจะได้รับรางวัลเป็นสกุลเงินของเครือข่าย - อีเธอร์ ในขณะที่เขียน รางวัลคือ 5 Ether แต่จะลดลงเมื่อเวลาผ่านไป

ดังนั้นนักขุด Ethereum จึงมั่นใจในการทำงานของเครือข่ายโดยการเพิ่มบล็อก และรับเงินสกุลเงินดิจิทัลสำหรับสิ่งนี้ มีข้อมูลมากมายบนอินเทอร์เน็ตเกี่ยวกับนักขุดและการขุด แต่เราจะมุ่งเน้นไปที่การสร้างสัญญา Solidity และ DApps บนเครือข่าย Ethereum

สรุปบทเรียน

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

Blockchain สามารถใช้จัดเก็บผลการทำธุรกรรมได้ วัตถุประสงค์หลักคือเพื่อจัดระเบียบธุรกรรมที่ปลอดภัยระหว่างฝ่ายต่างๆ (บุคคลและองค์กร) ระหว่างผู้ที่ไม่มีความไว้วางใจ คุณได้เรียนรู้ว่าธุรกิจเฉพาะด้านใดและสามารถใช้สัญญาอัจฉริยะ Ethereum blockchain และ Solidity ในด้านใดได้ ได้แก่ภาคธนาคาร การจดทะเบียนสิทธิในทรัพย์สิน เอกสาร ฯลฯ

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

นอกจากนี้เรายังพูดคุยสั้น ๆ เกี่ยวกับการขุดซึ่งเป็นกระบวนการในการเพิ่มบล็อกใหม่ให้กับบล็อกเชน การขุดเป็นสิ่งจำเป็นในการทำธุรกรรมให้เสร็จสิ้น ผู้ที่เกี่ยวข้องกับการขุดช่วยให้มั่นใจในการทำงานของบล็อกเชนและได้รับรางวัลเป็นสกุลเงินดิจิทัลสำหรับสิ่งนี้

บทที่ 2 การเตรียมสภาพแวดล้อมการทำงานใน Ubuntu และ Debian OSการเลือกระบบปฏิบัติการ
การติดตั้งยูทิลิตี้ที่จำเป็น
การติดตั้ง Geth และ Swarm บน Ubuntu
การติดตั้ง Geth และ Swarm บน Debian
การเตรียมการเบื้องต้น
กำลังดาวน์โหลดการแจกจ่าย Go
การตั้งค่าตัวแปรสภาพแวดล้อม
กำลังตรวจสอบเวอร์ชัน Go
การติดตั้ง Geth และ Swarm
การสร้างบล็อกเชนส่วนตัว
กำลังเตรียมไฟล์ genesis.json
สร้างไดเร็กทอรีสำหรับการทำงาน
สร้างบัญชี
การเริ่มต้นการเริ่มต้นโหนด
ตัวเลือกการเปิดตัวโหนด
เชื่อมต่อกับโหนดของเรา
การจัดการการขุดและการตรวจสอบยอดคงเหลือ
กำลังปิดคอนโซล Geth
สรุปบทเรียน

บทที่ 3 การเตรียมสภาพแวดล้อมการทำงานบน Raspberry Pi 3การเตรียม Raspberry Pi 3 สำหรับการทำงาน
การติดตั้ง Rasberian
กำลังติดตั้งการอัปเดต
การเปิดใช้งานการเข้าถึง SSH
การตั้งค่าที่อยู่ IP แบบคงที่
การติดตั้งยูทิลิตี้ที่จำเป็น
กำลังติดตั้ง Go
กำลังดาวน์โหลดการแจกจ่าย Go
การตั้งค่าตัวแปรสภาพแวดล้อม
กำลังตรวจสอบเวอร์ชัน Go
การติดตั้ง Geth และ Swarm
การสร้างบล็อกเชนส่วนตัว
ตรวจสอบบัญชีและยอดเงินของคุณ
สรุปบทเรียน

บทที่ 4. บัญชีและการโอนเงินระหว่างบัญชีดูและเพิ่มบัญชี
ดูรายการบัญชี
การเพิ่มบัญชี
รับตัวเลือกคำสั่งบัญชี
รหัสผ่านบัญชี
Cryptocurrency ใน Ethereum
หน่วยสกุลเงิน Ethereum
เรากำหนดยอดเงินปัจจุบันของบัญชีของเรา
โอนเงินจากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง
วิธี eth.sendTransaction
ดูสถานะการทำธุรกรรม
ใบเสร็จรับเงินการทำธุรกรรม
สรุปบทเรียน

บทที่ 5. การเผยแพร่สัญญาฉบับแรกของคุณสัญญาอัจฉริยะใน Ethereum
การดำเนินการสัญญาอัจฉริยะ
เครื่องเสมือนอีเธอเรียม
สภาพแวดล้อมการพัฒนาแบบรวม Remix Solidity IDE
กำลังรวบรวม
การเรียกฟังก์ชั่นสัญญา
การเผยแพร่สัญญาบนเครือข่ายส่วนตัว
รับคำจำกัดความ ABI และรหัสไบนารีของสัญญา
การเผยแพร่สัญญา
การตรวจสอบสถานะธุรกรรมการเผยแพร่สัญญา
การเรียกฟังก์ชั่นสัญญา
โซลคอมไพเลอร์แบทช์
การติดตั้ง solc บน Ubuntu
การติดตั้ง solc บน Debian
จัดทำสัญญา HelloSol
การเผยแพร่สัญญา
การติดตั้ง solc บน Rasberian
สรุปบทเรียน

บทที่ 6 สัญญาอัจฉริยะและ Node.jsการติดตั้ง Node.js
การติดตั้งบน Ubuntu
การติดตั้งบน Debian
การติดตั้งและใช้งาน Ganache-cli
การติดตั้ง Web3
กำลังติดตั้ง sol
การติดตั้ง Node.js บน Rasberian
สคริปต์เพื่อรับรายการบัญชีในคอนโซล
สคริปต์สำหรับการเผยแพร่สัญญาอัจฉริยะ
เรียกใช้และรับพารามิเตอร์
กำลังรับตัวเลือกการเปิดตัว
การรวบรวมสัญญา
เลิกบล็อกบัญชีของคุณ
กำลังโหลด ABI และรหัสไบนารีของสัญญา
การประมาณปริมาณก๊าซที่ต้องการ
สร้างออบเจ็กต์และเริ่มเผยแพร่สัญญา
เรียกใช้สคริปต์การเผยแพร่สัญญา
การเรียกใช้ฟังก์ชันสัญญาอัจฉริยะ
เป็นไปได้หรือไม่ที่จะอัปเดตสัญญาอัจฉริยะที่เผยแพร่?
การทำงานกับ Web3 เวอร์ชัน 1.0.x
กำลังรับรายการบัญชี
การเผยแพร่สัญญา
การเรียกฟังก์ชั่นสัญญา
โอนเงินจากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง
โอนเงินเข้าบัญชีสัญญา
การอัปเดตสัญญาอัจฉริยะของ HelloSol
สร้างสคริปต์เพื่อดูยอดเงินในบัญชีของคุณ
เพิ่มการเรียกฟังก์ชัน getBalance ให้กับสคริปต์ call_contract_get_promise.js
เราเติมเงินในบัญชีสัญญาอัจฉริยะ
สรุปบทเรียน

บทที่ 7 ความรู้เบื้องต้นเกี่ยวกับทรัฟเฟิลการติดตั้งทรัฟเฟิล
สร้างโครงการ HelloSol
การสร้างไดเรกทอรีโครงการและไฟล์
ไดเรกทอรีสัญญา
การโยกย้ายแคตตาล็อก
การทดสอบไดเรกทอรี
ไฟล์ truffle-config.js
จัดทำสัญญา HelloSol
เริ่มเผยแพร่สัญญา
การเรียกฟังก์ชันสัญญา HelloSol ในพรอมต์ Truffle
การเรียกฟังก์ชันสัญญา HelloSol จากสคริปต์ JavaScript ที่ใช้งาน Node.js
การติดตั้งโมดูลสัญญาทรัฟเฟิล
การเรียกใช้ฟังก์ชันสัญญา getValue และ getString
การเรียกฟังก์ชันสัญญา setValue และ setString
การแก้ไขสัญญาและการเผยแพร่ซ้ำ
การทำงานกับ Web3 เวอร์ชัน 1.0.x
การเปลี่ยนแปลงสัญญาอัจฉริยะของ HelloSol
สคริปต์สำหรับการเรียกวิธีสัญญา
การทดสอบในทรัฟเฟิล
การทดสอบความแข็ง
การทดสอบจาวาสคริปต์
สรุปบทเรียน

บทที่ 8 ประเภทข้อมูลที่เป็นของแข็งสัญญาสำหรับประเภทข้อมูลการเรียนรู้
ชนิดข้อมูลบูลีน
จำนวนเต็มที่ไม่ได้ลงนามและจำนวนเต็มที่ลงนาม
หมายเลขจุดคงที่
ที่อยู่
ตัวแปรประเภทที่ซับซ้อน
อาร์เรย์ขนาดคงที่
อาร์เรย์แบบไดนามิก
การแจงนับ
โครงสร้าง
การทำแผนที่พจนานุกรม
สรุปบทเรียน

บทที่ 9 การย้ายสัญญาไปยังเครือข่ายส่วนตัวและเครือข่าย Rinkebyการเผยแพร่สัญญาจาก Truffle ไปยังเครือข่าย Geth ส่วนตัว
กำลังเตรียมโหนดเครือข่ายส่วนตัว
จัดทำสัญญาจ้างงาน
รวบรวมและย้ายสัญญาไปยังเครือข่าย Truffle
เริ่มต้นการโยกย้ายเครือข่ายท้องถิ่น geth
รับสิ่งประดิษฐ์ทรัฟเฟิล
การเผยแพร่สัญญาจาก Truffle ไปยัง Rinkeby testnet
กำลังเตรียมโหนด Geth เพื่อทำงานกับ Rinkeby
การซิงโครไนซ์โหนด
การเพิ่มบัญชี
เติมเงินบัญชี Rinkeby ของคุณด้วยอีเธอร์
เปิดตัวการย้ายสัญญาไปยังเครือข่าย Rinkeby
การดูข้อมูลสัญญาบนเครือข่าย Rinkeby
คอนโซล Truffle สำหรับเครือข่าย Rinkeby
วิธีที่ง่ายกว่าในการเรียกใช้ฟังก์ชันสัญญา
การเรียกวิธีการทำสัญญาโดยใช้ Node.js
โอนเงินระหว่างบัญชีในคอนโซล Truffle สำหรับ Rinkby
สรุปบทเรียน

บทที่ 10 การจัดเก็บข้อมูลแบบกระจายอำนาจ Ethereum SwarmEthereum Swarm ทำงานอย่างไร?
การติดตั้งและเปิดใช้งาน Swarm
การดำเนินการกับไฟล์และไดเร็กทอรี
การอัปโหลดไฟล์ไปยัง Ethereum Swarm
กำลังอ่านไฟล์จาก Ethereum Swarm
ดูรายการของไฟล์ที่อัพโหลด
กำลังโหลดไดเร็กทอรีพร้อมไดเร็กทอรีย่อย
อ่านไฟล์จากไดเร็กทอรีที่ดาวน์โหลด
การใช้เกตเวย์ Swarm สาธารณะ
การเข้าถึง Swarm จากสคริปต์ Node.js
Perl Net::Ethereum::โมดูล Swarm
การติดตั้งโมดูล Net::Ethereum::Swarm
การเขียนและการอ่านข้อมูล
สรุปบทเรียน

บทที่ 11 กรอบงาน Web3.py สำหรับการทำงานกับ Ethereum ใน Pythonการติดตั้ง Web3.py
การอัพเดตและติดตั้งแพ็คเกจที่จำเป็น
การติดตั้งโมดูล easysolc
การเผยแพร่สัญญาโดยใช้ Web3.py
การรวบรวมสัญญา
กำลังเชื่อมต่อกับผู้ให้บริการ
ดำเนินการเผยแพร่สัญญา
บันทึกที่อยู่สัญญาและ abi ในไฟล์
เรียกใช้สคริปต์การเผยแพร่สัญญา
การเรียกวิธีการทำสัญญา
การอ่านที่อยู่และ abi ของสัญญาจากไฟล์ JSON
กำลังเชื่อมต่อกับผู้ให้บริการ
การสร้างออบเจ็กต์สัญญา
การเรียกวิธีการทำสัญญา
แห้วและ Web3.py
สรุปบทเรียน

บทที่ 12. คำทำนายSmart Contract สามารถเชื่อถือข้อมูลจากโลกภายนอกได้หรือไม่?
Oracles เป็นตัวกลางข้อมูลบล็อคเชน
แหล่งข้อมูล
รหัสเพื่อแสดงข้อมูลจากแหล่งที่มา
Oracle สำหรับบันทึกอัตราแลกเปลี่ยนใน blockchain
สัญญา USDRateOracle
การอัปเดตอัตราแลกเปลี่ยนในสัญญาอัจฉริยะ
การใช้ผู้ให้บริการซ็อกเก็ตเว็บ
กำลังรอกิจกรรม RateUpdate
การจัดการเหตุการณ์ RateUpdate
การเริ่มต้นการอัปเดตข้อมูลในสัญญาอัจฉริยะ
สรุปบทเรียน

ที่มา: will.com

เพิ่มความคิดเห็น