Triển khai hợp đồng thông minh bằng Foundry
Last updated
Last updated
Foundry là một bộ khung phát triển hợp đồng thông minh, viết bằng ngôn ngữ Rust, cho phép các nhà phát triển quản lý và lập hợp đồng, chạy thử nghiệm, triển khai hợp đồng và tương tác với mạng từ dòng lệnh thông qua các tập lệnh solidity.
Foundry bao gồm bốn công cụ CLI chính, cho phép phát triển hợp đồng thông minh một cách nhanh chóng và theo mô-đun, cụ thể là:
Forge: Bạn có thể triển khai, thử nghiệm và lập hợp đồng thông minh bằng Forge.
Cast: Cast giúp việc tương tác với các hợp đồng thông minh EVM trở nên đơn giản. Trong đó bao gồm các hoạt động lấy dữ liệu chuỗi, gửi giao dịch và những hoạt động khác.
Anvil: Bạn có cần khởi động một nút cục bộ không? Anvil là một môi trường nút cục bộ do Foundry cung cấp.
Chisel: REPL solidity nhanh chóng, hữu dụng và chi tiết.
Trong hướng dẫn này, bạn sẽ:
Tạo một dự án foundry đơn giản.
Lập và thử nghiệm một hợp đồng thông minh mẫu bằng Foundry.
Triển khai các hợp đồng thông minh bằng Foundry vào mạng Baobab của Klaytn.
Khám phá việc phân nhánh mạng chính thức bằng cast và anvil.
Để làm theo hướng dẫn này, bạn cần đáp ứng các điều kiện tiên quyết sau:
Trình biên tập mã: một trình biên tập mã nguồn như VS-Code.
Metamask: được dùng để triển khai hợp đồng, ký giao dịch và tương tác với hợp đồng.
Điểm cuối RPC: bạn có thể nhận từ một trong những Nhà cung cấp điểm cuối được hỗ trợ.
KLAY thử nghiệm từ Vòi: nạp tiền vào tài khoản với một lượng KLAY vừa đủ.
Để kiểm tra xem việc cài đặt foundry có thành công không, hãy chạy lệnh dưới đây:
Kết quả đầu ra
Sau khi cài đặt foundry thành công, bạn sẽ có quyền truy cập vào các công cụ CLI (forge, cast, anvil, chisel) có sẵn trong foundry. Hãy cùng lập dự án foundry bằng các bước sau:
Bước 1: Để bắt đầu một dự án mới, hãy chạy lệnh sau:
Bước 2: Điều hướng đến thư mục dự án của bạn.
Sau khi khởi tạo một dự án foundry, thư mục hiện tại của bạn sẽ bao gồm:
src: thư mục mặc định cho các hợp đồng thông minh của bạn.
tests: thư mục mặc định cho các thử nghiệm.
foundry.toml: tập tin cấu hình dự án mặc định.
lib: thư mục mặc định cho các phần phụ thuộc của dự án.
script: thư mục mặc định cho các tập tin tập lệnh solidity.
Trong phần này, chúng ta sẽ dùng hợp đồng đối ứng mẫu trong dự án foundry được khởi tạo. Tập tin counter.sol
trong thư mục src/
cần phải có dạng:
Hướng dẫn về mã
Đây là hợp đồng thông minh của bạn. Dòng 1 cho thấy Foundry sử dụng phiên bản Solidity 0.8.13 hoặc cao hơn. Từ dòng 4-12, một hợp đồng thông minh Counter
đã được tạo. Hợp đồng này chỉ chứa một số mới bằng cách sử dụng hàm setNumber và tăng số đó bằng cách gọi ra hàm increment.
Foundry cho phép chúng ta viết thử nghiệm bằng solidity thay vì javascript như trong các bộ khung phát triển hợp đồng thông mình khác. Trong dự án foundry đã khởi tạo, test/Counter.t.sol
là ví dụ về một thử nghiệm viết bằng solidity. Mã sẽ có dạng:
Mã trên cho thấy bạn đã nhập thư viện tiêu chuẩn của forge và Counter.sol.
Các bài kiểm tra ở trên kiểm tra các điểm sau:
Số đó có tăng lên không?
Số đó có bằng với số đã đặt không?
Để kiểm tra xem thử nghiệm của bạn có chạy ổn hay không, hãy chạy lệnh sau:
Kết quả đầu ra
Để tìm hiểu thêm về việc viết thử nghiệm, thử nghiệm nâng cao và các tính năng khác, hãy tham khảo Tài liệu của Foundry.
Lập hợp đồng bằng lệnh sau:
Để triển khai một hợp đồng bằng foundry, bạn phải cung cấp một URL RPC và một khóa riêng tư của tài khoản triển khai hợp đồng đó. Hãy xem danh sách rpc-providers trên Klaytn để tìm rpc-url của bạn, và tạo một tài khoản bằng MetaMask.
Bước 1: Để triển khai hợp đồng của bạn trên mạng Baobab của Klaytn, hãy chạy lệnh dưới đây:
Ví dụ
CẢNH BÁO: Hãy thay thế đối số khóa riêng tư bằng khóa riêng tư của bạn từ MetaMask. Hãy cẩn thận và đừng để lộ khóa riêng tư của bạn.
Kết quả đầu ra
Bước 2: Mở Klaytnscope để kiểm tra xem hợp đồng đối ứng có được triển khai thành công không.
Bước 3: Sao chép và dán hàm băm của giao dịch vào trường tìm kiếm và nhấn Enter. Bạn sẽ thấy hợp đồng vừa được triển khai.
Sau triển khai thành công hợp đồng thông minh của bạn, bạn cần gọi và thực thi các hàm đúng cách. Hãy cùng tương tác với các hợp đồng đã triển khai trên mạng Baobab của Klaytn bằng Cast. Trong phần này, bạn sẽ học cách sử dụng cast call để thực thi hàm chỉ độc
và cast send để thực thi các hàm viết
.
A. cast call: Để nhận số được lưu trữ trong hợp đồng, bạn sẽ gọi hàm number
. Chạy lệnh dưới đây để xem cách hoạt động.
Ví dụ
Kết quả đầu ra
Bạn sẽ nhận được dữ liệu này dưới định dạng thập lục phân:
Tuy nhiên, để nhận được kết quả mong muốn, hãy dùng cast để chuyển đổi kết quả trên. Trong trường hợp này, dữ liệu là một số, vì thế bạn có thể đổi nó thành cơ số 10 để nhận được kết quả 0:
Kết quả đầu ra
B. cast send: Để ký và xuất bản một giao dịch như thực thi hàm setNumber
trong hợp đồng đối ứng, hãy chạy lệnh dưới đây:
Ví dụ
Kết quả đầu ra
Kiểm tra chéo số
Kết quả đầu ra
Bạn sẽ nhận được dữ liệu này dưới định dạng thập lục phân:
Tuy nhiên, để nhận được kết quả mong muốn, hãy dùng cast để chuyển đổi kết quả trên. Trong trường hợp này, dữ liệu là một số, vì thế bạn có thể đổi nó thành cơ số 10 để nhận được kết quả 10:
Kết quả đầu ra
Foundry cho phép chúng ta mô phỏng mạng lưới chính thức thành mạng phát triển cục bộ (Anvil). Ngoài ra, bạn cũng có thể tương tác và thử nghiệm hợp đồng trên mạng thật bằng Cast.
Khi đã thiết lập và khởi động dự án Foundry xong, bạn có thể mô phỏng mạng lưới chính thức (cypress) bằng cách chạy lệnh dưới đây:
Ví dụ
Kết quả đầu ra
Sau khi chạy thành công lệnh này, giao diện dòng lệnh của bạn sẽ có dạng như hình trên. Bạn sẽ có 10 tài khoản được tạo ra với các khóa riêng tư và công khai, kèm theo 10.000 token được nạp sẵn. Máy chủ RPC của chuỗi được mô phỏng sẽ nhận và xử lý khối tại 127.0.0.1:8545/
.
Để xác minh rằng bạn đã mô phỏng mạng lưới, bạn có thể truy vấn số khối gần nhất:
Bạn có thể chuyển đổi kết quả từ nhiệm vụ trên từ hex sang decimal. Bạn sẽ nhận được số khối mới nhất từ lần bạn phân nhánh mạng lưới. Để xác minh điều này, hãy kiểm tra chéo số khối trên Klaytnscope.
Trong phần này, bạn sẽ tìm hiểu cách để chuyển token oUSDC từ một người có oUSDC sang một tài khoản được tạo bởi Anvil (0x70997970C51812dc3A010C7d01b50e0d17dc79C8 - Bob)
Chuyển oUSDC
Đi đến Klaytnscope và tìm người nắm giữ token oUSDC (ở đây). Hãy chọn một tài khoản ngẫu nhiên. Trong ví dụ này, ta sẽ dùng 0x8e61241e0525bd45cfc43dd7ba0229b422545bca
.
Hãy cùng xuất hợp đồng và tài khoản thành các biến của môi trường:
Chúng ta có thể kiểm tra số dư của Bob bằng cast call:
Kết quả đầu ra
Tương tự, ta cũng có thể kiểm tra số dư của người nắm giữ oUSDC bằng cast call:
Kết quả đầu ra
Hãy cùng chuyển một ít token từ người dùng may mắn này sang cho Alice bằng cast send:
Kết quả đầu ra
Hãy cùng kiểm tra xem việc chuyển tiền có thành công không:
Kết quả đầu ra
Kết quả đầu ra
Để được hướng dẫn sâu hơn về foundry, vui lòng tham khảo Tài liệu Foundry. Ngoài ra, bạn có thể tìm thấy cách triển khai mã đầy đủ cho hướng dẫn này trên GitHub.