คำแนะนำเกี่ยวกับเหตุการณ์และบันทึกใน Ethereum Smart Contracts

บล็อก 1NewsDevelopersEnterpriseBlockchain ExplainedEvents and ConferencesPressจดหมายข่าว

Contents

สมัครรับจดหมายข่าวของเรา.

ที่อยู่อีเมล

เราเคารพความเป็นส่วนตัวของคุณ

หน้าแรกบล็อกการพัฒนา Blockchain

คำแนะนำเกี่ยวกับเหตุการณ์และบันทึกใน Ethereum Smart Contracts

คำแนะนำทางเทคนิคเกี่ยวกับกรณีการใช้งานสำหรับเหตุการณ์และบันทึกบน Ethereum blockchain พร้อมโค้ดตัวอย่างโดย Joseph Chow ·มิถุนายน 6, 2016 ·โพสต์เมื่อ 6 มิถุนายน 2016

ConsenSys ส่งคำแนะนำเกี่ยวกับเหตุการณ์และบันทึกใน ethereum smart contract hero

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

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

  1. ค่าส่งคืนสัญญาอัจฉริยะสำหรับอินเทอร์เฟซผู้ใช้
  2. ทริกเกอร์แบบอะซิงโครนัสกับข้อมูล
  3. รูปแบบการจัดเก็บที่ถูกกว่า

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

1) ค่าการคืนสัญญาอัจฉริยะสำหรับอินเทอร์เฟซผู้ใช้

การใช้เหตุการณ์ที่ง่ายที่สุดคือการส่งคืนค่าจากสัญญาไปยังส่วนหน้าของแอป เพื่อเป็นตัวอย่างนี่คือปัญหา:

สัญญา ExampleContract {// ตัวแปรสถานะบางตัว … ฟังก์ชัน foo (int256 _value) ส่งกลับ (int256) {// จัดการสถานะ … ส่งคืน _value; }} รหัสภาษา: JavaScript (javascript)

สมมติว่า exampleContract เป็นอินสแตนซ์ของ ExampleContract ซึ่งเป็นส่วนหน้าโดยใช้ web3.js สามารถรับค่าส่งคืนโดยจำลองการดำเนินการตามสัญญา:

var returnValue = exampleContract.foo.call (2); console.log (returnValue) // ภาษา 2Code: JavaScript (javascript)

อย่างไรก็ตามเมื่อ web3.js ส่งการเรียกสัญญาเป็นธุรกรรมจะไม่สามารถรับค่าส่งคืน [1]:


var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); console.log (returnValue) // ธุรกรรม hashCode language: JavaScript (javascript)

มูลค่าส่งคืนของเมธอด sendTransaction คือแฮชของธุรกรรมที่สร้างขึ้นเสมอ ธุรกรรมจะไม่ส่งคืนมูลค่าสัญญาไปยังส่วนหน้าเนื่องจากธุรกรรมไม่ได้ถูกขุดและรวมอยู่ในบล็อกเชนในทันที.

วิธีแก้ปัญหาที่แนะนำคือการใช้เหตุการณ์และนี่เป็นหนึ่งในวัตถุประสงค์ที่มีไว้สำหรับเหตุการณ์.

สัญญา ExampleContract {event ReturnValue (ที่อยู่ที่จัดทำดัชนี _from, int256 _value); ฟังก์ชัน foo (int256 _value) ส่งกลับ (int256) {ReturnValue (msg.sender, _value); กลับ _value; }} จากนั้นส่วนหน้าจะได้รับค่าส่งกลับ: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // ตรวจสอบว่า result.args._from คือ web3.eth.coinbase จากนั้น // แสดง result.args._value ใน UI และเรียก // exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}) รหัสภาษา: JavaScript (javascript)

เมื่อธุรกรรมที่เรียกใช้ foo ถูกขุดระบบจะเรียกกลับภายในนาฬิกา สิ่งนี้ช่วยให้ส่วนหน้ารับค่าที่ส่งคืนจาก foo ได้อย่างมีประสิทธิภาพ.

2) ทริกเกอร์แบบอะซิงโครนัสกับข้อมูล

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

3) รูปแบบการจัดเก็บที่ถูกกว่า

กรณีการใช้งานที่สามค่อนข้างแตกต่างจากสิ่งที่ครอบคลุมและนั่นคือการใช้เหตุการณ์เป็นรูปแบบการจัดเก็บที่ถูกกว่ามาก ใน Ethereum Virtual Machine (EVM) และ กระดาษสีเหลือง Ethereum, เหตุการณ์เรียกว่าบันทึก (มี LOG opcodes) เมื่อพูดถึงพื้นที่จัดเก็บข้อมูลในทางเทคนิคจะถูกต้องกว่าที่จะกล่าวว่าข้อมูลสามารถจัดเก็บในบันทึกได้เมื่อเทียบกับข้อมูลที่จัดเก็บในเหตุการณ์ อย่างไรก็ตามเมื่อเราอยู่ในระดับที่สูงกว่าโปรโตคอลการบอกว่าสัญญาจะปล่อยหรือกระตุ้นเหตุการณ์ที่ส่วนหน้าสามารถตอบสนองได้ถูกต้องมากขึ้น เมื่อใดก็ตามที่เกิดเหตุการณ์ขึ้นบันทึกที่เกี่ยวข้องจะถูกเขียนลงในบล็อกเชน คำศัพท์ระหว่างเหตุการณ์และบันทึกเป็นอีกสาเหตุหนึ่งของความสับสนเนื่องจากบริบทกำหนดว่าคำใดถูกต้องมากกว่า.

บันทึกได้รับการออกแบบให้เป็นรูปแบบการจัดเก็บที่มีค่าใช้จ่ายก๊าซน้อยกว่าการจัดเก็บตามสัญญาอย่างมาก บันทึกโดยทั่วไป [2] มีค่าใช้จ่าย 8 ก๊าซต่อไบต์ในขณะที่การจัดเก็บตามสัญญามีค่าใช้จ่าย 20,000 ก๊าซต่อ 32 ไบต์ แม้ว่าบันทึกจะช่วยประหยัดก๊าซได้มาก แต่บันทึกก็ไม่สามารถเข้าถึงได้จากสัญญาใด ๆ [3].

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

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

สัญญา CryptoExchange {เงินฝากเหตุการณ์ (uint256 จัดทำดัชนี _market, ที่อยู่ที่จัดทำดัชนี _ ส่ง, uint256 _amount, uint256 _ เวลา) การฝากฟังก์ชัน (uint256 _amount, uint256 _market) ส่งคืน (int256) {// ทำการฝาก, อัปเดตยอดเงินของผู้ใช้, ฯลฯ เงินฝาก (_market, msg.sender, _amount, now); } ภาษารหัส: จาวาสคริปต์ (javascript)

สมมติว่าเราต้องการอัปเดต UI เมื่อผู้ใช้ทำการฝากเงิน นี่คือตัวอย่างของการใช้เหตุการณ์ (ฝาก) เป็นทริกเกอร์แบบอะซิงโครนัสกับข้อมูล (_market, msg.sender, _amount, now) สมมติว่า cryptoExContract เป็นอินสแตนซ์ของ CryptoExchange:

var DepositEvent = cryptoExContract.Deposit ({_ ผู้ส่ง: userAddress}); DepositEvent.watch (function (err, result) {if (err) {console.log (err) return;} // ผนวกรายละเอียดของ result.args เข้ากับ UI}) รหัสภาษา: JavaScript (javascript)

การปรับปรุงประสิทธิภาพในการรับเหตุการณ์ทั้งหมดสำหรับผู้ใช้เป็นสาเหตุที่ทำให้พารามิเตอร์ _sender ของเหตุการณ์ถูกจัดทำดัชนี: event Deposit (uint256 ที่จัดทำดัชนี _market, ที่อยู่ที่จัดทำดัชนี _sender, uint256 _amount, uint256 _time).

ตามค่าเริ่มต้นการรับฟังเหตุการณ์จะเริ่มต้นเมื่อเหตุการณ์นั้นถูกสร้างอินสแตนซ์เท่านั้น เมื่อ UI โหลดครั้งแรกจะไม่มีเงินฝากที่ต้องต่อท้าย ดังนั้นเราจึงต้องการดึงข้อมูลเหตุการณ์ตั้งแต่บล็อก 0 และทำได้โดยการเพิ่มพารามิเตอร์ fromBlock ให้กับเหตุการณ์.

var DepositEventAll = cryptoExContract.Deposit ({_ ผู้ส่ง: userAddress}, {fromBlock: 0, toBlock: ‘latest’}); DepositEventAll.watch (function (err, result) {if (err) {console.log (err) return;} // ผนวกรายละเอียดของ result.args เข้ากับ UI}) รหัสภาษา: JavaScript (javascript)

เมื่อ UI ถูกแสดงผล DepositEventAll.stopWatching () ควรถูกเรียกใช้.

นอกเหนือ – พารามิเตอร์ที่จัดทำดัชนี

สามารถจัดทำดัชนีพารามิเตอร์ได้สูงสุด 3 รายการ ตัวอย่างเช่นมาตรฐานโทเค็นที่เสนอมี: event Transfer (แอดเดรสที่จัดทำดัชนี _from, แอดเดรสที่ทำดัชนี _to, uint256 _value) ซึ่งหมายความว่าส่วนหน้าสามารถเฝ้าดูการโอนโทเค็นได้อย่างมีประสิทธิภาพนั่นคือ:

  • ส่งโดยที่อยู่ tokenContract.Transfer ({_ from: senderAddress})
  • หรือได้รับโดยที่อยู่ tokenContract.Transfer ({_ to: receiverAddress})
  • หรือส่งโดยที่อยู่ไปยังที่อยู่เฉพาะ tokenContract โอน ({_ from: senderAddress, _to: receiverAddress})

สรุป

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

ขอบคุณ Aaron Davis, Vincent Gariepy และ Joseph Lubin สำหรับคำติชมเกี่ยวกับบทความนี้.

อ้างอิง

[1] web3.js สามารถเฝ้าดูการทำธุรกรรมที่จะรวม blockchain จากนั้นเล่นธุรกรรมซ้ำในอินสแตนซ์ของ EVM เพื่อรับค่าตอบแทน แต่นี่เป็นตรรกะจำนวนมากที่จะเพิ่มลงใน web3.js [2] มีค่าใช้จ่ายก๊าซ 375 สำหรับการดำเนินการ LOG และ 375 ก๊าซต่อหัวข้อ แต่เมื่อมีการจัดเก็บไบต์จำนวนมากต้นทุนเหล่านี้จะแสดงเป็นเศษเล็กเศษน้อยของต้นทุนทั้งหมดของการจัดเก็บ. [3] การพิสูจน์บันทึกของ Merkle เป็นไปได้ดังนั้นหากหน่วยงานภายนอกจัดหาสัญญาที่มีหลักฐานดังกล่าวสัญญาสามารถตรวจสอบได้ว่าบันทึกนั้นมีอยู่จริงในบล็อกเชน.

ต้องการคำแนะนำสำหรับนักพัฒนาที่ส่งตรงถึงกล่องจดหมาย?

สมัครรับจดหมายข่าวสำหรับนักพัฒนาของ ConsenSys

จดหมายข่าวสมัครรับจดหมายข่าวของเราเพื่อรับข่าวสารล่าสุดของ Ethereum โซลูชันระดับองค์กรทรัพยากรสำหรับนักพัฒนาและอื่น ๆ ที่อยู่อีเมลเนื้อหาพิเศษวิธีสร้างผลิตภัณฑ์ Blockchain ที่ประสบความสำเร็จการสัมมนาผ่านเว็บ

วิธีสร้างผลิตภัณฑ์ Blockchain ที่ประสบความสำเร็จ

วิธีการตั้งค่าและเรียกใช้โหนด Ethereumการสัมมนาผ่านเว็บ

วิธีการตั้งค่าและเรียกใช้โหนด Ethereum

วิธีสร้าง Ethereum API ของคุณเองการสัมมนาผ่านเว็บ

วิธีสร้าง Ethereum API ของคุณเอง

วิธีสร้างโซเชียลโทเค็นการสัมมนาผ่านเว็บ

วิธีสร้างโซเชียลโทเค็น

การใช้เครื่องมือรักษาความปลอดภัยในการพัฒนาสัญญาอัจฉริยะการสัมมนาผ่านเว็บ

การใช้เครื่องมือรักษาความปลอดภัยในการพัฒนาสัญญาอัจฉริยะ

อนาคตของการเงินสินทรัพย์ดิจิทัลและ DeFiการสัมมนาผ่านเว็บ

อนาคตของการเงิน: สินทรัพย์ดิจิทัลและ DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map