Để định nghĩa một inteface ở trong Solidity, ta sử dụng từ khóa interface:

interface INumberInterface {
	function getNum(address _myAddress) public view returns (uint);
}

Chúng ta có thể sử dụng interface này như sau:

contract MyContract {
	address numberInterfaceAddress = 0xab38...
	INumberInterface numberContract = INumberInterface(numberInterfaceAddress);
	
	function someFunction() public {
		uint num = numberContract.getNum(msg.sender);
	}
}

Bằng cách này, chúng ta có thể giao tiếp với các contracts khác ở trên blockchain thông qua interface của chúng.

Warning

Tuy nhiên, có một vấn đề như sau: các smart contract sau khi được deployed lên blockchain thì sẽ không thể được chỉnh sửa. Nếu như có một lỗ hổng nào đó tồn tại trong code thì chúng ta không thể vá nó mà chỉ có thể yêu cầu người dùng sử dụng một smart contract khác đã được sửa nằm ở một địa chỉ khác.

Dẫn đến, việc gán cứng địa chỉ của một smart contract sẽ không đảm bảo tính bảo mật. Vì vậy, ta nên xây dựng một hàm cho phép thay đổi giá trị của địa chỉ này trong tương lai:

contract MyContract {
	INumberInterface numberContract;
	
	function setNumberContractAddress(address _address) external {
		numberContract = INumberInterface(_address);
	}
	
	function someFunction() public {
		uint num = numberContract.getNum(msg.sender);
	}
}

Dẫu vậy, hàm này vẫn tồn tại một lỗ hổng về access control bởi vì bất kỳ ai cũng có thể truy cập và thay đổi địa chỉ của numberContract1.

Footnotes

  1. Xem thêm Solidity - Ownable.