Hướng dẫn về sự kiện và nhật ký trong hợp đồng thông minh Ethereum

blog 1Tin tứcDevelopersEnterpriseBlockchain ExplainedEvents and ConferencePressBản tin

Theo dõi bản tin của chúng tôi.

Địa chỉ email

Chúng tôi tôn trọng quyền riêng tư của bạn

Trang chủBlogBlockchain phát triển

Hướng dẫn về sự kiện và nhật ký trong hợp đồng thông minh Ethereum

Giới thiệu kỹ thuật để sử dụng các trường hợp cho các sự kiện và nhật ký trên chuỗi khối Ethereum với mã mẫu của Joseph ChowJune 6, 2016Đăng vào ngày 6 tháng 6 năm 2016

ConsenSys Báo hiệu hướng dẫn về các sự kiện và nhật ký trong anh hùng hợp đồng thông minh ethereum

Các sự kiện và nhật ký rất quan trọng trong Ethereum vì chúng tạo điều kiện giao tiếp giữa các hợp đồng thông minh và giao diện người dùng của chúng. Trong phát triển web truyền thống, phản hồi của máy chủ được cung cấp trong một lệnh gọi lại giao diện người dùng. Trong Ethereum, khi một giao dịch được khai thác, các hợp đồng thông minh có thể phát ra các sự kiện và ghi nhật ký vào blockchain mà giao diện người dùng có thể xử lý sau đó. Có nhiều cách khác nhau để giải quyết các sự kiện và nhật ký. Phần giới thiệu kỹ thuật này sẽ giải thích một số nguồn gây nhầm lẫn liên quan đến các sự kiện và một số mã mẫu để làm việc với chúng.

Các sự kiện có thể gây nhầm lẫn vì chúng có thể được sử dụng theo nhiều cách khác nhau. Một sự kiện cho một người có thể không giống một sự kiện cho một người khác. Có 3 trường hợp sử dụng chính cho các sự kiện và nhật ký:

  1. Giá trị trả về của hợp đồng thông minh cho giao diện người dùng
  2. Kích hoạt không đồng bộ với dữ liệu
  3. Một hình thức lưu trữ rẻ hơn

Thuật ngữ giữa các sự kiện và nhật ký là một nguồn gây nhầm lẫn khác và điều này sẽ được giải thích trong trường hợp sử dụng thứ ba.

1) Giá trị trả lại của hợp đồng thông minh cho giao diện người dùng

Cách sử dụng sự kiện đơn giản nhất là chuyển các giá trị trả về từ các hợp đồng đến giao diện người dùng của ứng dụng. Để minh họa, đây là vấn đề:

hợp đồng Ví dụContract {// một số biến trạng thái … function foo (int256 _value) return (int256) {// thao tác trạng thái … return _value; }} Ngôn ngữ mã: JavaScript (javascript)

Giả sử exampleContract là một phiên bản của ExampleContract, một giao diện người dùng sử dụng web3.js, có thể lấy giá trị trả về bằng cách mô phỏng việc thực thi hợp đồng:

var returnValue = exampleContract.foo.call (2); console.log (returnValue) // Ngôn ngữ 2Code: JavaScript (javascript)

Tuy nhiên, khi web3.js gửi lệnh gọi hợp đồng dưới dạng giao dịch, nó không thể nhận được giá trị trả về [1]:

var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); console.log (returnValue) // ngôn ngữ mã băm giao dịch: JavaScript (javascript)

Giá trị trả về của phương thức sendTransaction luôn là giá trị băm của giao dịch được tạo. Các giao dịch không trả lại giá trị hợp đồng cho giao diện người dùng vì các giao dịch không được khai thác và đưa vào blockchain ngay lập tức.

Giải pháp được đề xuất là sử dụng một sự kiện và đây là một trong những mục đích dành cho các sự kiện.

hợp đồng ExampleContract {event ReturnValue (địa chỉ được lập chỉ mục _from, int256 _value); function foo (int256 _value) return (int256) {ReturnValue (msg.sender, _value); return _value; }} Một giao diện người dùng sau đó có thể lấy giá trị trả về: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // kiểm tra xem result.args._from có ​​phải là web3.eth.coinbase không sau đó // hiển thị result.args._value trong giao diện người dùng và gọi // exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}) Ngôn ngữ mã: JavaScript (javascript)

Khi giao dịch gọi foo được khai thác, lệnh gọi lại bên trong đồng hồ sẽ được kích hoạt. Điều này hiệu quả cho phép giao diện người dùng nhận các giá trị trả về từ foo.

2) Kích hoạt không đồng bộ với dữ liệu

Giá trị trả về là trường hợp sử dụng tối thiểu cho các sự kiện và các sự kiện thường có thể được coi là trình kích hoạt không đồng bộ với dữ liệu. Khi một hợp đồng muốn kích hoạt giao diện người dùng, hợp đồng sẽ phát ra một sự kiện. Như, giao diện người dùng đang theo dõi các sự kiện, nó có thể thực hiện hành động, hiển thị thông báo, v.v. Ví dụ về điều này được cung cấp trong phần tiếp theo (giao diện người dùng có thể được cập nhật khi người dùng gửi tiền).

3) Hình thức lưu trữ rẻ hơn

Trường hợp sử dụng thứ ba khá khác so với những gì được đề cập và đó là sử dụng các sự kiện như một hình thức lưu trữ rẻ hơn đáng kể. Trong Máy ảo Ethereum (EVM) và Giấy vàng Ethereum, các sự kiện được gọi là nhật ký (có mã quang LOG). Khi nói về lưu trữ, sẽ chính xác hơn về mặt kỹ thuật nếu nói rằng dữ liệu có thể được lưu trữ trong các bản ghi, trái ngược với dữ liệu được lưu trữ trong các sự kiện. Tuy nhiên, khi chúng ta vượt lên một cấp độ trên giao thức, sẽ chính xác hơn khi nói rằng các hợp đồng phát ra hoặc kích hoạt các sự kiện mà giao diện người dùng có thể phản ứng. Bất cứ khi nào một sự kiện được phát ra, các bản ghi tương ứng sẽ được ghi vào blockchain. Thuật ngữ giữa các sự kiện và nhật ký là một nguồn gây nhầm lẫn khác, bởi vì ngữ cảnh quyết định thuật ngữ nào chính xác hơn.

Các bản ghi được thiết kế để trở thành một hình thức lưu trữ có chi phí khí đốt ít hơn đáng kể so với lưu trữ theo hợp đồng. Về cơ bản, các bản ghi [2] tốn 8 gas / byte, trong khi lưu trữ theo hợp đồng tốn 20.000 gas / 32 byte. Mặc dù các bản ghi giúp tiết kiệm xăng rất lớn, nhưng không thể truy cập nhật ký từ bất kỳ hợp đồng nào [3].

Tuy nhiên, có những trường hợp sử dụng để sử dụng nhật ký làm bộ nhớ rẻ, thay vì trình kích hoạt cho giao diện người dùng. Một ví dụ phù hợp cho nhật ký là lưu trữ dữ liệu lịch sử có thể được hiển thị bởi giao diện người dùng.

Một sàn giao dịch tiền điện tử có thể muốn hiển thị cho người dùng tất cả các khoản tiền gửi mà họ đã thực hiện trên sàn giao dịch. Thay vì lưu trữ các chi tiết đặt cọc này trong hợp đồng, việc lưu trữ chúng dưới dạng nhật ký sẽ rẻ hơn nhiều. Điều này có thể xảy ra bởi vì một sàn giao dịch cần trạng thái số dư của người dùng, số dư này được lưu trữ trong bộ nhớ hợp đồng, nhưng không cần biết về chi tiết của các khoản tiền gửi trước đây.

hợp đồng CryptoExchange {event Deposit (uint256 được lập chỉ mục _market, địa chỉ được lập chỉ mục _sender, uint256 _amount, uint256 _time); chức năng gửi tiền (uint256 _amount, uint256 _market) trả về (int256) {// thực hiện gửi tiền, cập nhật số dư của người dùng, v.v. Gửi tiền (_market, msg.sender, _amount, bây giờ); } Ngôn ngữ mã: JavaScript (javascript)

Giả sử chúng ta muốn cập nhật giao diện người dùng khi người dùng gửi tiền. Dưới đây là một ví dụ về việc sử dụng sự kiện (Tiền gửi) làm trình kích hoạt không đồng bộ với dữ liệu (_market, msg.sender, _amount, ngay bây giờ). Giả sử cryptoExContract là một phiên bản của CryptoExchange:

var ký gửiEvent = cryptoExContract.Deposit ({_ sender: userAddress}); DepEvent.watch (function (err, result) {if (err) {console.log (err) return;} // nối chi tiết của result.args vào UI}) Ngôn ngữ mã: JavaScript (javascript)

Cải thiện hiệu quả của việc nhận tất cả các sự kiện cho người dùng là lý do tại sao tham số _sender cho sự kiện được lập chỉ mục: event Deposit (uint256 được lập chỉ mục _market, địa chỉ được lập chỉ mục _sender, uint256 _amount, uint256 _time).

Theo mặc định, việc lắng nghe sự kiện chỉ bắt đầu tại thời điểm sự kiện được khởi tạo. Khi giao diện người dùng được tải lần đầu tiên, không có khoản tiền gửi nào để thêm vào. Vì vậy, chúng tôi muốn truy xuất các sự kiện kể từ khối 0 và điều đó được thực hiện bằng cách thêm một tham số fromBlock vào sự kiện.

var ký quỹEventAll = cryptoExContract.Deposit ({_ sender: userAddress}, {fromBlock: 0, toBlock: ‘mới nhất’}); DepEventAll.watch (function (err, result) {if (err) {console.log (err) return;} // nối chi tiết của result.args vào UI}) Ngôn ngữ mã: JavaScript (javascript)

Khi giao diện người dùng được hiển thị, thì sẽ gọi tiền gửi EventAll.stopWatching ().

Bên cạnh – Các thông số được lập chỉ mục

Có thể lập chỉ mục tối đa 3 tham số. Ví dụ: một tiêu chuẩn mã thông báo được đề xuất có: sự kiện Chuyển giao (địa chỉ được lập chỉ mục _from, địa chỉ được lập chỉ mục _to, uint256 _value). Điều này có nghĩa là một giao diện người dùng có thể chỉ cần theo dõi việc chuyển mã thông báo một cách hiệu quả:

  • được gửi bởi một địa chỉ tokenContract.Transfer ({_ from: senderAddress})
  • hoặc được nhận bởi một địa chỉ tokenContract.Transfer ({_ to: receiverAddress})
  • hoặc được gửi bởi một địa chỉ đến một địa chỉ cụ thể tokenContract.Transfer ({_ from: senderAddress, _to: receiverAddress})

Phần kết luận

Ba trường hợp sử dụng đã được trình bày cho các sự kiện. Đầu tiên, sử dụng một sự kiện để chỉ cần nhận giá trị trả về từ một hàm hợp đồng được gọi với sendTransaction (). Thứ hai, sử dụng sự kiện làm trình kích hoạt không đồng bộ với dữ liệu, có thể thông báo cho người quan sát chẳng hạn như giao diện người dùng. Thứ ba, sử dụng một sự kiện để viết nhật ký trong blockchain như một hình thức lưu trữ rẻ hơn. Phần giới thiệu này đã cho thấy một số API để làm việc với các sự kiện. Có các cách tiếp cận khác để làm việc với các sự kiện, nhật ký và biên nhận và những chủ đề này có thể được đề cập trong các bài viết trong tương lai.

Cảm ơn Aaron Davis, Vincent Gariepy và Joseph Lubin đã phản hồi về bài viết này.

Người giới thiệu

[1] web3.js có thể theo dõi giao dịch được đưa vào chuỗi khối, sau đó phát lại giao dịch trong một phiên bản của EVM, để nhận giá trị trả về, nhưng đây là một lượng logic đáng kể cần thêm vào web3.js [2] Có chi phí gas là 375 cho một hoạt động LOG và 375 gas cho mỗi chủ đề, nhưng khi nhiều byte đang được lưu trữ, những chi phí này chiếm một phần không đáng kể trong tổng chi phí lưu trữ. [3] Merkle bằng chứng cho nhật ký là có thể, vì vậy nếu một thực thể bên ngoài cung cấp hợp đồng với bằng chứng như vậy, một hợp đồng có thể xác minh rằng nhật ký thực sự tồn tại bên trong blockchain.

Muốn hướng dẫn dành cho nhà phát triển đến thẳng hộp thư đến của bạn?

Đăng ký nhận bản tin dành cho nhà phát triển của ConsenSys

Bản tin Đăng ký nhận bản tin của chúng tôi để biết tin tức mới nhất về Ethereum, các giải pháp doanh nghiệp, tài nguyên dành cho nhà phát triển và hơn thế nữa.Cách xây dựng một sản phẩm chuỗi khối thành côngHội thảo trên web

Cách xây dựng một sản phẩm chuỗi khối thành công

Cách thiết lập và chạy Ethereum NodeHội thảo trên web

Cách thiết lập và chạy Ethereum Node

Cách xây dựng API Ethereum của riêng bạnHội thảo trên web

Cách xây dựng API Ethereum của riêng bạn

Cách tạo mã thông báo xã hộiHội thảo trên web

Cách tạo mã thông báo xã hội

Sử dụng các công cụ bảo mật trong phát triển hợp đồng thông minhHội thảo trên web

Sử dụng các công cụ bảo mật trong phát triển hợp đồng thông minh

Tương lai của tài sản kỹ thuật số tài chính và DeFiHội thảo trên web

Tương lai của tài chính: Tài sản kỹ thuật số và DeFi

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