調(diào)用其他合約
在Solidity中,一個合約可以調(diào)用另一個合約的函數(shù),這在構(gòu)建復(fù)雜的DApps時非常有用。
在已知合約代碼(或接口)和地址的情況,調(diào)用已部署的合約。
編寫一個簡單的惡合約OtherContract,用于被其他合約調(diào)用:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract OtherContract {
//狀態(tài)變量
uint256 private _x = 0;
//收到ETH事件記錄amount和gas
event Log(uint256 amount, uint gas);
function getBalance() view public returns(uint) {
return address(this).balance;
}
function setX(uint256 x) external payable {
_x = x;
if(msg.value > 0) {
emit Log(msg.value, gasleft());
}
}
// 讀取_x
function getX() external view returns(uint x) {
x = _x;
}
}
合約包含一個狀態(tài)變量_x,一個在收到ETH時出發(fā)的事件Log,和三個函數(shù)
getBalance() :返回合約的ETH余額
setX():聲明為external payable的類型的函數(shù),可以設(shè)置_x 的值,并向合約發(fā)送ETH
getX(): 讀取_x的值。
和Java類似。由于_x 用關(guān)鍵字private聲明為私有變量。合約setX和getX讓外界通過這對函數(shù)讀寫變量
調(diào)用目標(biāo)合約
可以利用合約的地址和合約代碼(或者接口)來創(chuàng)建合約的引用
_Name(_Address)
_Name合約名,應(yīng)該和合約代碼(接口)中標(biāo)注的合約名保持一致;_Address合約地址。通過合約引用調(diào)用其他函數(shù)
_Name(_Address).f()
CallOtherContract 實現(xiàn)四種不同調(diào)用合約的用法:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import "./OtherContract.sol";
contract CallOtherContract {
//1. 傳入合約地址
function callSetX(address _Address, uint256 x) external {
OtherContract(_Address).setX(x);
}
//2. 傳入合約變量
function callGetX(OtherContract _Address) external view returns (uint x) {
x = _Address.getX();
}
//3. 創(chuàng)建合約變量
function callGetX2(address _Address) external view returns(uint x) {
OtherContract oc = OtherContract(_Address);
x = oc.getX();
}
// 4.調(diào)用合約并發(fā)送ETH
function setXTransferETH(address otherContract, uint256 x) external payable {
OtherContract(otherContract).setX{value: msg.value}(x);
}
}
- 傳入合約地址 callSetX
copy 合約OtherContract的地址,賦值給_Address , 給x賦值123 進(jìn)行測試 - 傳入合約變量 callGetX
copy 合約OtherContract的地址,獲取x值 :123 - 創(chuàng)建合約變量 callGetX2
copy 合約OtherContract的地址,獲取x值 :123 - 調(diào)用合約并發(fā)送 setXTransferETH
現(xiàn)在 Account 設(shè)置 10 Ether,(不設(shè)置默認(rèn)0也可以但是看不到變化)
copy 合約OtherContract的地址,給x賦值456 ,測試
在合約OtherContract的getX,getBalance查看,測試結(jié)果