Gọi một hợp đồng thông minh từ JavaScript
Trong hướng dẫn này, chúng ta sẽ xem cách gọi một hàm hợp đồng thông minh từ JavaScript. Đầu tiên là đọc trạng thái của một hợp đồng thông minh (ví dụ: số dư của một người nắm giữ ERC20), sau đó chúng ta sẽ sửa đổi trạng thái của chuỗi khối bằng cách thực hiện một giao dịch chuyển token. Bạn nên quen thuộc với việc thiết lập một môi trường JS để tương tác với chuỗi khối.
Trong ví dụ này, chúng ta sẽ sử dụng token DAI, cho mục đích thử nghiệm, chúng ta sẽ phân nhánh chuỗi khối bằng cách sử dụng ganache-cli và mở khóa một địa chỉ đã có rất nhiều DAI:
ganache-cli -f https://mainnet.infura.io/v3/[KHÓA INFURA CỦA BẠN] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81Để tương tác với một hợp đồng thông minh, chúng ta sẽ cần địa chỉ và ABI của nó:
1const ERC20TransferABI = [2 {3 constant: false,4 inputs: [5 {6 name: "_to",7 type: "address",8 },9 {10 name: "_value",11 type: "uint256",12 },13 ],14 name: "transfer",15 outputs: [16 {17 name: "",18 type: "bool",19 },20 ],21 payable: false,22 stateMutability: "nonpayable",23 type: "function",24 },25 {26 constant: true,27 inputs: [28 {29 name: "_owner",30 type: "address",31 },32 ],33 name: "balanceOf",34 outputs: [35 {36 name: "balance",37 type: "uint256",38 },39 ],40 payable: false,41 stateMutability: "view",42 type: "function",43 },44]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"Hiện tất cảĐối với dự án này, chúng tôi đã lược bỏ ABI ERC20 hoàn chỉnh để chỉ giữ lại hàm balanceOf và transfer nhưng bạn có thể tìm thấy ABI ERC20 đầy đủ tại đây (opens in a new tab).
Sau đó, chúng ta cần khởi tạo hợp đồng thông minh của mình:
1const web3 = new Web3("http://localhost:8545")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)Chúng ta cũng sẽ thiết lập hai địa chỉ:
- địa chỉ sẽ nhận tiền chuyển và
- địa chỉ mà chúng ta đã mở khóa sẽ gửi nó đi:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"Trong phần tiếp theo, chúng ta sẽ gọi hàm balanceOf để lấy số lượng token hiện tại mà cả hai địa chỉ đang nắm giữ.
Gọi: Đọc giá trị từ một hợp đồng thông minh
Ví dụ đầu tiên sẽ gọi một phương thức “hằng số” và thực thi phương thức hợp đồng thông minh của nó trong Máy ảo Ethereum (EVM) mà không cần gửi bất kỳ giao dịch nào. Để làm điều này, chúng ta sẽ đọc số dư ERC20 của một địa chỉ. Đọc bài viết của chúng tôi về token ERC20.
Bạn có thể truy cập các phương thức hợp đồng thông minh đã được khởi tạo mà bạn đã cung cấp ABI như sau: yourContract.methods.methodname. Bằng cách sử dụng hàm call, bạn sẽ nhận được kết quả thực thi của hàm.
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("Đã xảy ra lỗi", err)4 return5 }6 console.log("Số dư là: ", res)7})Hãy nhớ rằng DAI ERC20 có 18 chữ số thập phân, nghĩa là bạn cần loại bỏ 18 số 0 để có được số tiền chính xác. uint256 được trả về dưới dạng chuỗi vì JavaScript không xử lý các giá trị số lớn. Nếu bạn không chắc chắn cách xử lý các số lớn trong JS, hãy xem hướng dẫn của chúng tôi về bignumber.js (opens in a new tab).
Gửi: Gửi giao dịch đến một hàm của hợp đồng thông minh
Đối với ví dụ thứ hai, chúng ta sẽ gọi hàm chuyển tiền của hợp đồng thông minh DAI để gửi 10 DAI đến địa chỉ thứ hai của chúng ta. Hàm chuyển tiền chấp nhận hai tham số: địa chỉ người nhận và số lượng token cần chuyển:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("Đã xảy ra lỗi", err)6 return7 }8 console.log("Hàm băm của giao dịch: " + res)9 })Hiện tất cảHàm gọi trả về hàm băm của giao dịch sẽ được khai thác vào chuỗi khối. Trên Ethereum, các hàm băm giao dịch có thể dự đoán được - đó là cách chúng ta có thể lấy hàm băm của giao dịch trước khi nó được thực thi (tìm hiểu cách tính các hàm băm tại đây (opens in a new tab)).
Vì hàm chỉ gửi giao dịch lên chuỗi khối, chúng ta không thể thấy kết quả cho đến khi biết giao dịch được khai thác và đưa vào chuỗi khối. Trong hướng dẫn tiếp theo, chúng ta sẽ tìm hiểu cách chờ một giao dịch được thực thi trên chuỗi khối bằng cách biết hàm băm của nó (opens in a new tab).
Lần cập nhật trang lần cuối: 21 tháng 10, 2025