Bài giảng 4: Emulator Trace and Contract Monads
Plutus Pioneer Program - Cohort 3 February 3, 2022
Offical Video by Lars Brünjes: PPP-Cohort3-Lecture4
Google Doc version can be found HERE
#
Table of Contents#
Chuẩn bị cho bài giảng 4Trước khi bắt đầu bài giảng 4, trước tiên chúng ta phải cập nhật môi trường phát triển của mình. Bạn có thể sao chép và dán trực tiếp bất kỳ mã nào trong hướng dẫn này vào thiết bị đầu cuối hoặc IDE của mình.
Đầu tiên, hãy đến thư mục plutus-pioneer-program để lấy nội dung bài giảng tuần 4.
Bây giờ bạn có thể điều hướng đến thư mục week04 hiện tại và mở tệp cabal.project:
Lấy thẻ plutus-apps bên trong tệp cabal.project:
Quay trở lại thư mục plutus-apps và cập nhật nó vào thẻ git hiện tại:
Bây giờ bạn đã được cập nhật và có thể chạy nix-shell trong thư mục này. Chạy nix-shell:
Quay trở lại thư mục week04 để bắt đầu chạy các lệnh cabal:
Nếu thành công, bây giờ bạn đã sẵn sàng để bắt đầu bài giảng:
#
MonadsĐể khám phá một số lớp Haskell mới, chúng ta cần tải hello.hs. Trong nix-shell trong thư mục week04, run:
Output:
- lưu ý: Nếu repl đang chạy, bạn có thể nhấn CTRL+Z để quay lại nix-shell
Chúng ta đã học về lớp Functor IO.
Ví dụ, Hàm chữ hoa. Đầu tiên import Data.Char:
Toán tử (>>):
Toán tử liên kết (>>=):
Return:
Một Hàm IO phức tạp hơn trong hello.hs:
Gọi hàm *bar:
lưu ý, nếu bạn ở bên ngoài thay thế, bạn có thể trực tiếp chạy hello.hs bằng cách:
#
Kiểu Maybe:Ví dụ, đọc. Đầu tiên import Text.Read (readMaybe):
readMaybe (lý tưởng hơn, tránh đưa ra một ngoại lệ):
Bây giờ chúng ta sẽ tìm hiểu cách sử dụng phức tạp hơn của read Maybe trong tệp Maybe.hs. Thoát thay thế bằng CTRL+Z, sau đó thực hiện:
Bây giờ chúng ta tải tệp Maybe.hs:
Bên trong tệp Maybe.hs, trước tiên chúng ta xem xét hàm foo:
Đầu ra ví dụ của chức năng foo:
Bây giờ chúng ta xem xét bindMaybe trong Maybe.hs (để tạo một phiên bản ngắn gọn hơn của hàm foo được gọi là foo' ):
Kết quả đầu ra ví dụ của hàm foo' như mong đợi:
#
Kiểu Either:Ví dụ kiểu Either:
Bây giờ chúng tôi tải file Either.hs:
Bên trong both.hs, trước tiên chúng ta xem xét hàm readEither:
Đầu ra ví dụ của readEither:
Sau đó, chúng tôi xem xét hàm foo:
Ví dụ đầu ra của foo:
Sau đó, chúng tôi xem foo' (phiên bản ngắn gọn hơn của foo):
Kết quả đầu ra ví dụ của foo' như mong đợi:
Cuối cùng, chúng tôi tải tệp Writer.hs:
Hàm quan tâm đầu tiên trong tệp là number
:
Ví dụ về number:
Bây giờ chúng ta nhìn vào foo:
Ví dụ về foo:
Bây giờ chúng ta xem xét hàm bindWriter với foo':
Ví dụ về foo':
Cuối cùng, chúng tôi đã xem xét toàn bộ Lớp Monad:
#
Trình giả lập MonadTrước khi chúng ta có thể bắt đầu sử dụng Trình giả lập Trace Monad, hãy bắt đầu bằng cách tải bản repl.
Import Plutus.Trace.Emulator and Data.Default
Chúng tôi được giới thiệu về Cấu hình giả lập:
Sau đó là phiên bản Default Emulator Config:
Ví dụ đơn giản Default Emulator Config:
Chạy trình giả lập Trace:
Ở đây chúng ta thấy rằng đầu ra chứa một lượng dữ liệu quá lớn, tương ứng với các sự kiện giả lập của cấu hình mặc định. Điều này là không thực tế, vì vậy thay vào đó, chúng tôi sẽ sử dụng một trình mô phỏng khác có tên là runEmulatorTraceIO.
Chạy Trình giả lập Trace IO:
Ví dụ đơn giản về Run Emulator TraceIO:
Chạy trình giả lập TraceIO’
Như bạn có thể thấy, Run Emulator TraceIO' có thêm hai đối số. Bạn có thể thay đổi cách phân phối ví ban đầu.
TraceConfig ở đâu:
Bây giờ chúng ta sẽ xem xét một ví dụ thực tế trong tệp Trace.hs. Tải tệp Trace.hs:
Nhìn vào tệp Trace.hs:
Chúng ta có thể chạy theo dõi bằng hàm test:
#
The Contract MonadTrong đó w: Cho phép hợp đồng ghi log kiểu w (có thể truyền thông tin ra bên ngoài)
Where s: Chỉ định những điểm cuối nào khả dụng
Trong đó e: Chỉ định loại thông báo lỗi
Trong đó a: Là kết quả
Trước tiên, chúng ta cần tải tệp Contract.hs:
Mở file Contract.hs, trước tiên chúng ta sẽ tìm hiểu cách đưa ra lỗi trong hợp đồng:
Chúng ta có thể kiểm tra myContract1 bằng cách gọi hàm test1:
Thay vào đó, chúng ta có thể sửa đổi myContract1 để bắt ngoại lệ. Contract2 hiện được tạo để xử lý ngoại lệ:
Chúng ta có thể kiểm tra mycontract2 bằng cách gọi hàm test2:
Tạo một hợp đồng mới myContract3, chúng ta có thể xem cách sử dụng các endpoints trong Hợp đồng:
Chúng ta có thể kiểm tra contract 3 bằng cách gọi hàm test3:
Tạo một hợp đồng mới myContract4, chúng ta có thể xem cách để hợp đồng chờ 'n' vị trí:
We can test out contract 4 by calling the test4 function:
#
Homework Part 1Bài tập về nhà mục tiêu 1 là viết một theo dõi trình giả lập nhận 2 khoản thanh toán số nguyên và sử dụng payContract để thực hiện hai khoản thanh toán cho ví người nhận 2 với độ trễ là một vị trí. Nhập Wallet.Emulator.Wallet: nhập Wallet.Emulator.Wallet
Đầu tiên, chúng ta cần chuyển hai giá trị vào paytrace (tôi đã định nghĩa chúng lần lượt là x , y):
Thứ hai, chúng ta cần gọi payContract từ Wallet 1:
Bây giờ, chúng ta cần sử dụng điểm cuối @pay và sử dụng Payparams để thanh toán cho người thụ hưởng Wallet2 với giá trị đầu tiên, x:
Chờ 1 slot trước khi gọi thanh toán tiếp theo:
Bây giờ, chúng ta cần sử dụng lại điểm cuối @pay và sử dụng Payparams để thanh toán cho người thụ hưởng Wallet2 với giá trị thứ hai, y:
Chờ 1 slot sau lần thanh toán thứ 2:
Trình giả lập dấu vết cuối cùng sẽ giống như:
Chạy payTest1 ta được kết quả như sau:
#
Homework Part 2Mục tiêu của bài tập 2 là giải thích trường hợp một ví không có đủ tiền để chuyển sang ví thứ hai. Trong payTest2, khoản thanh toán đầu tiên lớn hơn số dư ví trong ví 1. Do đó, chúng tôi cần xử lý lỗi cho khoản thanh toán đầu tiên x, trong khi vẫn tiếp tục hợp đồng để chuyển sang giá trị y.
Trước tiên, chúng ta cần xem xét payContract, cụ thể hơn:
We need to first look at the payContract, more specifically:
Đầu tiên, vì chúng tôi sẽ sử dụng xử lý lỗi giải nén, chúng tôi cần nhập nó vào tệp:
Bây giờ chúng ta có thể sửa đổi dòng gửi giao dịch ở trên để xử lý lỗi, tạo nhật ký và sau đó tiếp tục hợp đồng:
PayContract cuối cùng sẽ giống như sau:
Chạy payTest2 ta được kết quả như sau: