Call and Send

Có hai phương thức của Web3.js dùng để gọi hàm của smart contract là callsend. 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 gasgasPrice ở trong object truyền vào hàm send 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

  1. Xem thêm Solidity - Visibility.