Call and Send
Có hai phương thức của Web3.js dùng để gọi hàm của smart contract là call
và send
. Cả hai phương thức này đều có giá trị trả về là một Promise và dữ liệu trong Promise được biểu diễn dưới dạng JSON.
Call
Để gọi view function hay pure function của contract thì ta cần sử dụng phương thức call
. Phương thức này sẽ không tạo ra transaction.
Ví dụ bên dưới gọi thực thi hàm myMethod
của contract MyContract
với đối số là 123
.
await MyContract.methods.myMethod(123).call();
Khi tạo các state variable có visibility là public
, Solidity sẽ tự động implement getter cho chúng1.
Giả sử ta có state variable sau:
uint public myNumber;
Để xem giá trị của state variable này, ta sẽ làm như sau:
const myNumber = await MyContract.methods.myNumber().call();
Đối với state variable có kiểu mảng, chẳng hạn như sau:
uint[] public myArray;
Đối số truyền vào sẽ là index của phần tử mà ta muốn lấy giá trị:
const element = await MyContract.methods.myArray(1).call();
Send
Phương thức send
giúp gọi tất cả những function nào mà không phải là view hay pure function.
Đồng thời, phương thức này cũng sẽ tạo transaction ở trên blockchain. Do có tạo transaction nên user cần phải chi trả gas và do đó mà ví Metamask sẽ cần phải hiển thị để yêu cầu người dùng xác nhận việc ký vào transaction.
Cách sử dụng phương thức send
tương tự với phương thức call
:
await MyContract.methods.myMethod(123).send();
Đối số của phương thức send
là một object và chứa các thông tin cần thiết, chẳng hạn như địa chỉ của người gửi, số tiền cần gửi, etc.
Xét contract sau:
contract MyContract {
uint256 public myNumber;
constructor(uint256 _myNumber) {
myNumber = _myNumber;
}
function setMyNumber(uint256 _myNumber) public {
myNumber = _myNumber;
}
}
Ví dụ bên dưới gọi hàm setMyNumber
thông qua phương thức send
:
const receipt = await MyContract.methods.setMyNumber(11).send({
from: account.address,
gas: 1000000,
gasPrice: 10000000000,
});
console.log('Transaction Hash: ' + receipt.transactionHash);
Có thể thấy, ta có thể định nghĩa các event listener cho các sự kiện xảy ra khi gọi phương thức send
.
Note
Nếu để trống trường
gas
vàgasPrice
ở trong object truyền vào hàmsend
thì ví Metamask sẽ cho phép người dùng chọn.
Calling Payable Functions
Để thực thi các hàm có modifier là payable
thì người dùng cần phải chi trả Ether. Giá trị chi trả được thể hiện thông qua thuộc tính value
của object truyền vào phương thức send
như sau:
.send({ from: userAccount, value: web3js.utils.toWei("0.001", "ether") })
Tiền chuyển đi sử dụng đơn vị Wei, là một đơn vị con của Ether. Mỗi Ether sẽ có Wei. Phương thức toWei
giúp chuyển đổi giữa từ Ether sang Wei.
Footnotes
-
Xem thêm Solidity - Visibility. ↩