วิธีการโต้ตอบกับ Ethereum blockchain และสร้างฐานข้อมูลด้วย Python และ SQL

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

การตั้งค่าสำหรับการเผชิญหน้าครั้งแรก

ก่อนอื่นคุณจะต้องติดตั้ง web3py Web3py เป็นห้องสมุด Python สำหรับเชื่อมต่อกับ Ethereum blockchain สิ่งที่คุณต้องทราบล่วงหน้าคือไม่มีระบบการบริหารส่วนกลางที่สามารถดาวน์โหลดข้อมูลได้ โหนดที่เชื่อมต่อระหว่างกัน (“ เพียร์”) ซึ่งใช้ทรัพยากรร่วมกันจัดเก็บสำเนาที่ตรวจสอบแล้วของข้อมูล (หรือส่วนหนึ่ง) เครือข่ายดำเนินการโปรโตคอล Ethereum ซึ่งกำหนดกฎของการมีปฏิสัมพันธ์ของโหนดกับแต่ละอื่น ๆ และ / หรือสัญญาสมาร์ทผ่านเครือข่ายที่

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

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

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

เวลาสำหรับแนวทางแรก นำเข้าวัตถุ Web3 และสร้างการเชื่อมต่อ HTTP

จาก web3 นำเข้า Web3
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number")

และคุณพร้อมแล้ว! ตอนนี้คุณสามารถสำรวจโครงสร้างข้อมูลด้วย web3 API

กำลังดึงข้อมูลเกี่ยวกับบล็อกเฉพาะ ...

#current block number
>>> web3.eth.blockNumber
5658173
#get เนื้อหาของบล็อกที่ขุดได้ล่าสุด
>>> web3.eth.getBlock ('ล่าสุด')

คำสั่งนี้ส่งคืนโครงสร้างข้อมูล AttributeDict ซึ่งเป็นพจนานุกรมของคู่ของคีย์ - ค่าที่มีลักษณะดังนี้:

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

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

ทั่วไป

การทำเหมืองแร่ที่เกี่ยวข้อง

ลุง

วิชาการ

…ธุรกรรมและใบเสร็จรับเงิน

ขณะนี้เราสามารถค้นหาธุรกรรมเดียวในบล็อกโดยตัวระบุที่ไม่ซ้ำกันเช่นแฮชธุรกรรม

เมื่อก่อนหน้านี้ web3py จะส่งคืนพจนานุกรมแอตทริบิวต์ให้เรา ตารางด้านล่างนี้สรุปว่าแต่ละคีย์หมายถึงอะไร

ในที่สุดเราสามารถดูการรับธุรกรรม:

การรับธุรกรรมมีการทำซ้ำและรายการใหม่สองสามรายการ ใหม่มีการอธิบายด้านล่าง

สำหรับการอ้างอิงฉันรวมทรัพยากรเพิ่มเติมต่าง ๆ นอกเหนือจากกระดาษสีเหลืองเพื่อรวบรวมตารางเหล่านี้ [2, 3, 4, 5]

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

ระบบจัดการฐานข้อมูล

เมื่อวางแผนที่จะเขียนข้อมูลของคุณไปยังฐานข้อมูลที่เหมาะสมคุณอาจตระหนักว่ามีโซลูชั่นมากมายสำหรับระบบการจัดการสำหรับผู้ที่ชื่นชอบ Python เช่น SQLite ที่ไม่มีเซิร์ฟเวอร์หรือ MySQL, PostgreSQL หรือ Hadoop ขึ้นอยู่กับสิ่งที่คุณตั้งใจจะทำคุณจะต้องกำหนดตัวเลือกที่ดีที่สุดสำหรับโครงการของคุณ โดยทั่วไปฉันพบว่าจุดเหล่านี้มีประโยชน์:

  • ขนาดฐานข้อมูลที่ตั้งใจไว้คืออะไร (เช่นสามารถประมวลผลในระบบเครื่องเดียว)
  • รายการจะถูกแก้ไขบ่อยครั้งหรือไม่หรือจะคงที่หรือไม่
  • ควรเข้าถึงและแก้ไขฐานข้อมูลโดยหลายฝ่าย / แอพพร้อมกันหรือไม่?

บล็อกเชน Ethereum เติบโตอย่างต่อเนื่องเมื่อเวลาผ่านไปใกล้ถึง 1 TB ณ เดือนมิถุนายน 2561 ซึ่งมีขนาดเล็กจึงไม่เหมาะสำหรับระบบประมวลผลแบบกระจายเช่น Hadoop ฐานข้อมูล blockchain จะถูกเขียนเพียงครั้งเดียวแล้วขยายด้วยรายการใหม่เท่านั้นโดยไม่เปลี่ยนแปลงรายการเก่า กรณีการใช้งานที่ตั้งใจของฐานข้อมูลนี้จะถูกเขียนขึ้นโดยหนึ่งแชนเนลและเข้าถึงได้โดยแชนเนลอื่น ๆ แบบอ่านอย่างเดียวดังนั้นเราจึงไม่จำเป็นต้องเรียกใช้มันบนเซิร์ฟเวอร์ การเก็บฐานข้อมูลไว้ในเครื่องของคุณจะส่งผลให้อ่านได้อย่างรวดเร็วซึ่งเป็นที่ต้องการและสามารถทำได้ด้วยระบบการจัดการแบบไร้เซิร์ฟเวอร์เช่น SQLite และ Python มีห้องสมุด sqlite3 ในตัวดังนั้นเราไม่จำเป็นต้องติดตั้งแพ็คเกจใหม่

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

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

ฐานข้อมูลที่ฉันออกแบบประกอบด้วย 3 ตาราง:

  • ด่วน: ข้อมูลธุรกรรมที่เกี่ยวข้องมากที่สุดสำหรับการเข้าถึงและการวิเคราะห์อย่างรวดเร็ว
  • TX: ข้อมูลธุรกรรมที่เหลือทั้งหมด
  • บล็อก: ข้อมูลเฉพาะบล็อก

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

มูลค่าธุรกรรมยอดคงเหลือและตัวเลขขนาดใหญ่อื่น ๆ จะต้องเก็บไว้ในฐานข้อมูลเป็นสตริง เหตุผลคือ SQLite สามารถจัดการได้เฉพาะจำนวนเต็มที่ลงนามซึ่งเก็บไว้ใน 8 ไบต์โดยมีค่าสูงสุด 2 maximum-1 = 9223372036854775807 ซึ่งมักจะต่ำกว่าค่าธุรกรรมใน wei (เช่น 1 ETH = 10¹⁸ wei) เท่านั้น

สร้างฐานข้อมูลขนาดเล็กของคุณ

รหัสเต็มสามารถพบได้ใน GitHub มันจะจัดระเบียบข้อมูล blockchain ตามสคีมาด้านบนและส่งออกไฟล์ blockchain.db ที่มีข้อมูลของจำนวนบล็อกที่ระบุไว้ล่วงหน้า หากต้องการทดสอบให้ไปที่ไฟล์ database.py และเลือกหมายเลขที่เหมาะสมสำหรับจำนวนบล็อกที่จะเขียนเช่น

Nblocks = 10,000

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

# หรือการเชื่อมต่อผ่านโหนดบน VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /')

และแก้ไขเส้นทาง จากนั้นก็รันใน commandbase python database.py รหัสจะถ่ายโอนจำนวนบล็อกที่เขียนล่าสุดลงในไฟล์ lastblock.txt ในกรณีที่คุณต้องรีสตาร์ทตำแหน่งที่คุณออกไป

วิธีใช้ฐานข้อมูล

เมื่อคุณเขียนรายการแรกไปยังฐานข้อมูลคุณสามารถเริ่มสื่อสารกับมันผ่านทาง ipython shell ตัวอย่างเช่นหากต้องการพิมพ์ 5 แถวแรกของตาราง“ ด่วน” คุณสามารถเรียกใช้รหัสด้านล่าง

โหนดท้องถิ่นกับ Infura

ถ้าคุณต้องการสร้างฐานข้อมูลขนาดใหญ่คุณควรดาวน์โหลด geth และซิงค์โหนด การซิงโครไนซ์สามารถทำได้ใน 3 โหมดพื้นฐาน:

หากคุณไม่ต้องการสถานะบัญชีที่ผ่านมาคุณสามารถซิงค์โหนดของคุณในโหมดรวดเร็ว [6]

ด้านล่างนี้เป็นพล็อตที่แสดงความเร็วที่โค้ดนี้เขียนไปยังฐานข้อมูลการสื่อสารกับโหนดที่ถูกซิงค์แบบเต็ม (IPC) กับที่อยู่บน Infura (Infura) อย่างที่คุณเห็นมันจ่ายให้กับการรันโค้ดนี้บนโหนดโลคัลเนื่องจากคุณได้รับความเร็วเพิ่มขึ้นเกือบ 2 ออเดอร์ของขนาด (aka 100x)!

เวลาที่ใช้ในการเขียน 10 บล็อกธุรกรรมระหว่างบล็อก 2000000 และ 2000400 เวลาอยู่ในระดับลอการิทึม (10⁰ = 1, 10¹ = 10 และอื่น ๆ ;)

สรุป

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

ติดต่อ analytics@validitylabs.org หากคุณมีความสนใจในบริการการวิเคราะห์ blockchain ของ Validity Labs