Tương tác với các hợp đồng bên ngoài
Hợp đồng thông minh có thể tương tác với các hợp đồng khác trên blockchain Ethereum, cho phép chúng gọi các hàm, đọc biến và gửi Ether hoặc token. Một cách để tạo điều này là bằng cách sử dụng Web3j, một thư viện Java nhẹ cho việc làm việc với Ethereum. Web3j có thể tự động tạo mã bọc hợp đồng thông minh, cho phép triển khai mượt mà và tương tác với các hợp đồng thông minh từ JVM.
Để tương tác với các hợp đồng bên ngoài bằng cách sử dụng Web3j, bạn cần trước tiên biên dịch hợp đồng thông minh của mình và tạo mã bao bọc. Sau đó, bạn có thể tạo và triển khai hợp đồng thông minh của mình hoặc sử dụng một hợp đồng hiện có, từ đó dễ dàng thực hiện giao dịch và gọi trực tiếp các phương thức của hợp đồng thông minh.
Sự kiện và nhật ký
Sự kiện rất quan trọng để theo dõi và giám sát hoạt động hợp đồng thông minh trên blockchain. Chúng cung cấp một cách để phát ra nhật ký có thể được lưu trữ và sau này được truy xuất bởi các hệ thống ngoại xích. Sự kiện giúp việc theo dõi các sự kiện cụ thể của hợp đồng hoặc thay đổi trong biến trạng thái dễ dàng hơn, điều này đặc biệt hữu ích cho các ứng dụng phi tập trung (dApps) cần cập nhật theo thời gian thực.
Logs là các bản ghi được phát ra từ các sự kiện và được lưu trữ trên blockchain. Chúng là một phần quan trọng của hệ sinh thái Ethereum, vì chúng cho phép giao tiếp hiệu quả giữa các hợp đồng thông minh và các hệ thống ngoại chuỗi. Logs cũng được lập chỉ mục, giúp cho các ứng dụng dễ dàng lọc và tìm kiếm các sự kiện cụ thể hoặc điểm dữ liệu.
Ví dụ: Triển khai hợp đồng thông minh bằng Remix và MetaMask
Bước 1: Mở Remix IDE
Đầu tiên, mở Remix IDE ( https://remix.ethereum.org/trong trình duyệt web của bạn.
Bước 2: Tạo một tập tin mới
Nhấp vào nút "+" ở góc trên cùng bên trái của IDE để tạo Không gian làm việc trống mới. Sau đó nhấp vào Trang "Tệp mới" để tạo Tệp mới
Đặt tên tệp là “Auction.sol”.
Bước 3: Xác định hợp đồng
Sao chép và dán đoạn mã sau vào tệp “Auction.sol” mới:
TypeScript// SPDX-License-Identifier: MIT// Chỉ định phiên bản Soliditypragma solidity ^0.8.0;// Xác định hợp đồng đấu giá hợp đồng đấu giá { // Khai báo biến trạng thái địa chỉ chủ sở hữu công phải trả; // Chủ sở hữu hợp đồng (có thể hủy cuộc đấu giá) uint public startBlock; // Số khối mà tại đó cuộc đấu giá bắt đầu uint kết thúc công khaiBlock; // Số khối mà tại đó cuộc đấu giá kết thúc chuỗi ipfsHash công khai; // Hàm băm IPFS cho vật phẩm được bán đấu giá bool công khai bị hủy bỏ; Cuộc đấu giá đã bị hủy bỏ hay chưa đã kết thúc công khai; Cuộc đấu giá đã kết thúc với giá cao nhất công khai hay chưa; Giá thầu cao nhất cho đến nay giải quyết nhà thầu công khai phải trả cao nhất; Địa chỉ của người trả giá cao nhất // Tuyên bố sự kiện sự kiện AuctionCanceled(); Sự kiện phát ra khi cuộc đấu giá bị hủy bỏ sự kiện HighestBidIncrease (địa chỉ người trả giá, số tiền uint); Sự kiện phát ra khi đặt giá thầu cao nhất mới Sự kiện AuctionEnded (địa chỉ người chiến thắng, số tiền uint); Sự kiện phát ra khi phiên đấu giá kết thúc // Khai báo ánh xạ ánh xạ (địa chỉ => uint256) số dư công khai; hàm constructor constructor() {owner = payable(msg.sender); // Đặt chủ sở hữu đến địa chỉ triển khai hợp đồng startBlock = block.number; // Đặt khối bắt đầu thành số khối hiện tại endBlock = startBlock + 40320; // Đặt khối kết thúc thành 1 tuần (40320 khối) sau khối bắt đầu ipfsHash = ""; Khởi tạo hàm băm IPFS thành một chuỗi trống } // Hàm để đặt hàm bid placeBid() phải trả công khai { require(block.number >= startBlock &&&block.number <= endBlock, "Auction is not active."); // Kiểm tra xem phiên đấu giá có đang hoạt động hay không, yêu cầu (msg.value > highestBid, "Đã có giá thầu cao hơn."); // Kiểm tra xem giá thầu mới có cao hơn yêu cầu trả giá cao nhất hiện tại không (!đã hủy, "Đấu giá bị hủy."); // Kiểm tra xem cuộc đấu giá chưa bị hủy Nếu có người trả giá cao nhất trước đó, hãy thêm số tiền giá thầu của họ vào số dư của họ nếu (highestBidder != address(0)) {balances[highestBidder] += highestBid; } // Đặt giá thầu cao nhất mới và giá thầu cao nhấtBid = msg.value; highestBidder = phải trả (msg.sender); Phát ra một sự kiện để báo hiệu giá thầu cao nhất mới đã được đặt phát ra HighestBidIncrease (msg.sender, msg.value); } // Chức năng hủy hàm đấu giá cancelAuction() public { require(msg.sender == owner, "Chỉ chủ sở hữu mới có thể hủy cuộc đấu giá."); // Kiểm tra xem người gửi có phải là chủ sở hữu yêu cầu không (!end, "Auction has end."); // Kiểm tra xem phiên đấu giá chưa kết thúc // Đặt cờ bị hủy và phát ra một sự kiện để báo hiệu cuộc đấu giá đã bị hủy, hủy = true; phát ra Đấu giáHủy bỏ(); } // Hàm kết thúc hàm đấu giá endAuction() public { require(block.number > endBlock, "Auction is not over."); // Kiểm tra xem cuộc đấu giá có vượt quá yêu cầu hay không (!canceled, "Auction is canceled."); // Kiểm tra xem cuộc đấu giá chưa bị hủy yêu cầu (!end, "Auction has end."); // Kiểm tra xem cuộc đấu giá chưa kết thúc // Đặt cờ kết thúc và phát ra một sự kiện để báo hiệu cuộc đấu giá đã kết thúc = true; phát ra AuctionEnded(cao nhấtBidder, highestBid); Chuyển số tiền đặt giá thầu cao nhất cho chủ sở hữu owner.transfer(highestBid); Nếu có người trả giá cao nhất trước đó, hãy thêm số tiền giá thầu của họ vào số dư của họ nếu (highestBidder != address(0)) {balances[highestBidder] += highestBid; } } // Hàm để đặt hàm băm IPFS cho mục đang được đấu giá hàm setIpfsHash(string memory hash) public { require(msg.sender == owner, "Chỉ chủ sở hữu mới có thể đặt hàm băm IPFS."); // Kiểm tra xem người gửi có phải là chủ sở hữu ipfsHash = hash; // Đặt hàm băm IPFS thành giá trị được cung cấp }}
Đoạn code này định nghĩa Đấu giá
hợp đồng, cho phép người dùng đặt giá cho một mục và kết thúc phiên đấu giá sau một khoảng thời gian nhất định. Hợp đồng cũng có một chức năng để hủy phiên đấu giá và một chức năng để thiết lập một băm IPFS cho mục đang được đấu giá.
Bước 4: Biên soạn hợp đồng
Nhấp vào tab “Trình biên dịch Solidity” trong menu bên trái. Dưới “Biên dịch Auction.sol”, nhấp vào nút “Biên dịch”. Hợp đồng sẽ được biên dịch thành công và bạn sẽ thấy một dấu đánh dấu xanh bên cạnh “Auction.sol” trong trình duyệt tệp.
Bước 5: Triển khai hợp đồng
Nhấp vào tab “Triển khai & Chạy giao dịch” trong menu bên trái. Dưới mục “Môi trường”, chọn “Injected Web3” làm môi trường. Dưới mục “Hợp đồng”, chọn “Đấu giá” là hợp đồng cần triển khai. Nhấn nút “Triển khai”.
Bước 6: Tương tác với hợp đồng
Khi hợp đồng được triển khai, bạn có thể tương tác với nó bằng cách sử dụng các chức năng khác nhau được xác định trong hợp đồng. Ví dụ: bạn có thể gọi placeBid()
hàm để đặt một lượt đặt chỗ trên mục
Bằng cách sử dụng Remix và MetaMask, bạn có thể dễ dàng triển khai và tương tác với các hợp đồng thông minh trên mạng Ethereum, cho phép phát triển và thử nghiệm các ứng dụng phi tập trung trong môi trường thân thiện với người dùng.
Nổi bật
Hợp đồng thông minh có thể tương tác với các hợp đồng khác trên blockchain Ethereum, cho phép gọi hàm, đọc biến và chuyển Ether hoặc token.
Web3j là một thư viện Java nhẹ giúp tương tác với Ethereum. Nó có thể tự động tạo mã bọc hợp đồng thông minh để triển khai và tương tác một cách liền mạch với các hợp đồng từ JVM.
Sự kiện là yếu tố quan trọng để theo dõi và giám sát hoạt động hợp đồng trên blockchain. Chúng phát ra nhật ký có thể được lưu trữ và lấy ra bởi các hệ thống off-chain, cho phép cập nhật theo thời gian thực cho dApps.
Logs, những bản ghi được phát ra bởi sự kiện, đóng vai trò quan trọng trong việc giao tiếp hiệu quả giữa các hợp đồng thông minh và hệ thống ngoại chuỗi. Chúng được chỉ mục, cho phép dễ dàng lọc và tìm kiếm các sự kiện cụ thể hoặc điểm dữ liệu.
Ví dụ cung cấp cho thấy quá trình triển khai hợp đồng thông minh bằng cách sử dụng Remix IDE và MetaMask. Nó bao gồm các bước như tạo một tệp mới, định nghĩa hợp đồng, biên dịch nó, triển khai nó và tương tác với các chức năng của nó.
Tương tác với các hợp đồng bên ngoài
Hợp đồng thông minh có thể tương tác với các hợp đồng khác trên blockchain Ethereum, cho phép chúng gọi các hàm, đọc biến và gửi Ether hoặc token. Một cách để tạo điều này là bằng cách sử dụng Web3j, một thư viện Java nhẹ cho việc làm việc với Ethereum. Web3j có thể tự động tạo mã bọc hợp đồng thông minh, cho phép triển khai mượt mà và tương tác với các hợp đồng thông minh từ JVM.
Để tương tác với các hợp đồng bên ngoài bằng cách sử dụng Web3j, bạn cần trước tiên biên dịch hợp đồng thông minh của mình và tạo mã bao bọc. Sau đó, bạn có thể tạo và triển khai hợp đồng thông minh của mình hoặc sử dụng một hợp đồng hiện có, từ đó dễ dàng thực hiện giao dịch và gọi trực tiếp các phương thức của hợp đồng thông minh.
Sự kiện và nhật ký
Sự kiện rất quan trọng để theo dõi và giám sát hoạt động hợp đồng thông minh trên blockchain. Chúng cung cấp một cách để phát ra nhật ký có thể được lưu trữ và sau này được truy xuất bởi các hệ thống ngoại xích. Sự kiện giúp việc theo dõi các sự kiện cụ thể của hợp đồng hoặc thay đổi trong biến trạng thái dễ dàng hơn, điều này đặc biệt hữu ích cho các ứng dụng phi tập trung (dApps) cần cập nhật theo thời gian thực.
Logs là các bản ghi được phát ra từ các sự kiện và được lưu trữ trên blockchain. Chúng là một phần quan trọng của hệ sinh thái Ethereum, vì chúng cho phép giao tiếp hiệu quả giữa các hợp đồng thông minh và các hệ thống ngoại chuỗi. Logs cũng được lập chỉ mục, giúp cho các ứng dụng dễ dàng lọc và tìm kiếm các sự kiện cụ thể hoặc điểm dữ liệu.
Ví dụ: Triển khai hợp đồng thông minh bằng Remix và MetaMask
Bước 1: Mở Remix IDE
Đầu tiên, mở Remix IDE ( https://remix.ethereum.org/trong trình duyệt web của bạn.
Bước 2: Tạo một tập tin mới
Nhấp vào nút "+" ở góc trên cùng bên trái của IDE để tạo Không gian làm việc trống mới. Sau đó nhấp vào Trang "Tệp mới" để tạo Tệp mới
Đặt tên tệp là “Auction.sol”.
Bước 3: Xác định hợp đồng
Sao chép và dán đoạn mã sau vào tệp “Auction.sol” mới:
TypeScript// SPDX-License-Identifier: MIT// Chỉ định phiên bản Soliditypragma solidity ^0.8.0;// Xác định hợp đồng đấu giá hợp đồng đấu giá { // Khai báo biến trạng thái địa chỉ chủ sở hữu công phải trả; // Chủ sở hữu hợp đồng (có thể hủy cuộc đấu giá) uint public startBlock; // Số khối mà tại đó cuộc đấu giá bắt đầu uint kết thúc công khaiBlock; // Số khối mà tại đó cuộc đấu giá kết thúc chuỗi ipfsHash công khai; // Hàm băm IPFS cho vật phẩm được bán đấu giá bool công khai bị hủy bỏ; Cuộc đấu giá đã bị hủy bỏ hay chưa đã kết thúc công khai; Cuộc đấu giá đã kết thúc với giá cao nhất công khai hay chưa; Giá thầu cao nhất cho đến nay giải quyết nhà thầu công khai phải trả cao nhất; Địa chỉ của người trả giá cao nhất // Tuyên bố sự kiện sự kiện AuctionCanceled(); Sự kiện phát ra khi cuộc đấu giá bị hủy bỏ sự kiện HighestBidIncrease (địa chỉ người trả giá, số tiền uint); Sự kiện phát ra khi đặt giá thầu cao nhất mới Sự kiện AuctionEnded (địa chỉ người chiến thắng, số tiền uint); Sự kiện phát ra khi phiên đấu giá kết thúc // Khai báo ánh xạ ánh xạ (địa chỉ => uint256) số dư công khai; hàm constructor constructor() {owner = payable(msg.sender); // Đặt chủ sở hữu đến địa chỉ triển khai hợp đồng startBlock = block.number; // Đặt khối bắt đầu thành số khối hiện tại endBlock = startBlock + 40320; // Đặt khối kết thúc thành 1 tuần (40320 khối) sau khối bắt đầu ipfsHash = ""; Khởi tạo hàm băm IPFS thành một chuỗi trống } // Hàm để đặt hàm bid placeBid() phải trả công khai { require(block.number >= startBlock &&&block.number <= endBlock, "Auction is not active."); // Kiểm tra xem phiên đấu giá có đang hoạt động hay không, yêu cầu (msg.value > highestBid, "Đã có giá thầu cao hơn."); // Kiểm tra xem giá thầu mới có cao hơn yêu cầu trả giá cao nhất hiện tại không (!đã hủy, "Đấu giá bị hủy."); // Kiểm tra xem cuộc đấu giá chưa bị hủy Nếu có người trả giá cao nhất trước đó, hãy thêm số tiền giá thầu của họ vào số dư của họ nếu (highestBidder != address(0)) {balances[highestBidder] += highestBid; } // Đặt giá thầu cao nhất mới và giá thầu cao nhấtBid = msg.value; highestBidder = phải trả (msg.sender); Phát ra một sự kiện để báo hiệu giá thầu cao nhất mới đã được đặt phát ra HighestBidIncrease (msg.sender, msg.value); } // Chức năng hủy hàm đấu giá cancelAuction() public { require(msg.sender == owner, "Chỉ chủ sở hữu mới có thể hủy cuộc đấu giá."); // Kiểm tra xem người gửi có phải là chủ sở hữu yêu cầu không (!end, "Auction has end."); // Kiểm tra xem phiên đấu giá chưa kết thúc // Đặt cờ bị hủy và phát ra một sự kiện để báo hiệu cuộc đấu giá đã bị hủy, hủy = true; phát ra Đấu giáHủy bỏ(); } // Hàm kết thúc hàm đấu giá endAuction() public { require(block.number > endBlock, "Auction is not over."); // Kiểm tra xem cuộc đấu giá có vượt quá yêu cầu hay không (!canceled, "Auction is canceled."); // Kiểm tra xem cuộc đấu giá chưa bị hủy yêu cầu (!end, "Auction has end."); // Kiểm tra xem cuộc đấu giá chưa kết thúc // Đặt cờ kết thúc và phát ra một sự kiện để báo hiệu cuộc đấu giá đã kết thúc = true; phát ra AuctionEnded(cao nhấtBidder, highestBid); Chuyển số tiền đặt giá thầu cao nhất cho chủ sở hữu owner.transfer(highestBid); Nếu có người trả giá cao nhất trước đó, hãy thêm số tiền giá thầu của họ vào số dư của họ nếu (highestBidder != address(0)) {balances[highestBidder] += highestBid; } } // Hàm để đặt hàm băm IPFS cho mục đang được đấu giá hàm setIpfsHash(string memory hash) public { require(msg.sender == owner, "Chỉ chủ sở hữu mới có thể đặt hàm băm IPFS."); // Kiểm tra xem người gửi có phải là chủ sở hữu ipfsHash = hash; // Đặt hàm băm IPFS thành giá trị được cung cấp }}
Đoạn code này định nghĩa Đấu giá
hợp đồng, cho phép người dùng đặt giá cho một mục và kết thúc phiên đấu giá sau một khoảng thời gian nhất định. Hợp đồng cũng có một chức năng để hủy phiên đấu giá và một chức năng để thiết lập một băm IPFS cho mục đang được đấu giá.
Bước 4: Biên soạn hợp đồng
Nhấp vào tab “Trình biên dịch Solidity” trong menu bên trái. Dưới “Biên dịch Auction.sol”, nhấp vào nút “Biên dịch”. Hợp đồng sẽ được biên dịch thành công và bạn sẽ thấy một dấu đánh dấu xanh bên cạnh “Auction.sol” trong trình duyệt tệp.
Bước 5: Triển khai hợp đồng
Nhấp vào tab “Triển khai & Chạy giao dịch” trong menu bên trái. Dưới mục “Môi trường”, chọn “Injected Web3” làm môi trường. Dưới mục “Hợp đồng”, chọn “Đấu giá” là hợp đồng cần triển khai. Nhấn nút “Triển khai”.
Bước 6: Tương tác với hợp đồng
Khi hợp đồng được triển khai, bạn có thể tương tác với nó bằng cách sử dụng các chức năng khác nhau được xác định trong hợp đồng. Ví dụ: bạn có thể gọi placeBid()
hàm để đặt một lượt đặt chỗ trên mục
Bằng cách sử dụng Remix và MetaMask, bạn có thể dễ dàng triển khai và tương tác với các hợp đồng thông minh trên mạng Ethereum, cho phép phát triển và thử nghiệm các ứng dụng phi tập trung trong môi trường thân thiện với người dùng.
Nổi bật
Hợp đồng thông minh có thể tương tác với các hợp đồng khác trên blockchain Ethereum, cho phép gọi hàm, đọc biến và chuyển Ether hoặc token.
Web3j là một thư viện Java nhẹ giúp tương tác với Ethereum. Nó có thể tự động tạo mã bọc hợp đồng thông minh để triển khai và tương tác một cách liền mạch với các hợp đồng từ JVM.
Sự kiện là yếu tố quan trọng để theo dõi và giám sát hoạt động hợp đồng trên blockchain. Chúng phát ra nhật ký có thể được lưu trữ và lấy ra bởi các hệ thống off-chain, cho phép cập nhật theo thời gian thực cho dApps.
Logs, những bản ghi được phát ra bởi sự kiện, đóng vai trò quan trọng trong việc giao tiếp hiệu quả giữa các hợp đồng thông minh và hệ thống ngoại chuỗi. Chúng được chỉ mục, cho phép dễ dàng lọc và tìm kiếm các sự kiện cụ thể hoặc điểm dữ liệu.
Ví dụ cung cấp cho thấy quá trình triển khai hợp đồng thông minh bằng cách sử dụng Remix IDE và MetaMask. Nó bao gồm các bước như tạo một tệp mới, định nghĩa hợp đồng, biên dịch nó, triển khai nó và tương tác với các chức năng của nó.