我們從
上一篇知道了可以從B合約調用A合約的方法,這一篇來講一個更為常用的調用方法:
Import,Import在很多程式語言裡面都有,用處是可以調用其他的程式片段,因為如果程式都寫在一起,那麼一支程式裡面就會過於龐大,而且也沒辦法共用,為了增加使用性,會把常用的方法抽取出來,等需要用的地方再Import進去使用就好,這樣可以大量的簡單化程式碼,程式不是寫的愈龐大就愈好,應該是愈簡單、愈單純讓人一眼就能理解愈好,因為程式往往最後不是開發的那個人在維護的,所以寫得愈讓人能簡單理解愈能減少維護的時間和成本,因為時間就是金錢也是成本。
下面我們就來講解Import該怎麼使用及可以調用外部在GitHub上面寫好的合約,比如說OpenZeppelin的
ERC20合約,這些合約會比自己開發的ERC20合約來的安全一點,因為是公開的,有經過市場上面的認證,有漏洞早就被挖出來修正了。
直接上程式碼:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import "./CallFromContract.sol";
contract ImportContract{
ContractA public A;
//Call A的第一種型式
function callSetX(uint _x) public {
A.setX(_x);
}
//Call A的第二種型式
function callSetXFromAddress(uint _x) public {
A.setX(_x);
}
//調用合約A的設定X和傳送ETH幣
function callSetXandSendEther(uint _x) public payable {
A.setXandSendEther{value: msg.value}(_x);
}
}
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
// constructor() ERC20("cryptoljia", "JIA") {
// }
//初始化 ERC20必須給name和symbol
constructor(string memory name, string memory symbol) ERC20(name, symbol) {
}
//重寫ERC20的decimals
function decimals() public pure override returns (uint8) {
return 9;
}
}
從程式碼可以看出ImportContract我們照著
上一篇的參考,把Contract B的寫法搬到ImportContract裡面,可以看到因為有Import,所以就不需要Contract A的address就可以調用了。
https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token
OpenZeppelin還蠻常會用到的,因為上面有寫好的ERC合約範本,用這種公開的範本會比自己創建的來的安全,OpenZeppelin後面我們也會再看到,這部份有空再做介紹,這邊只要會引用就可以了。
ImportContract的部份各位就可以自己Deploy上去玩看看,我這邊就不再貼上來了,只是要注意的是:MyToken在Deploy時,記得要給NAME和SYMBOL
由於MyToken我們引用了ERC20合約,所以MyToken也就是一個ERC20的合約了,這部份各位可以玩看看,以上就是Import的介紹,有什麼錯誤的地方也歡迎留言跟我說,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。