智能合約開發實戰(16) - Import

更新於 發佈於 閱讀時間約 6 分鐘

我們從上一篇知道了可以從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

https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token

另外我們也可以調用外部的合約,最常用的是OpenZeppelin的相關ERC合約,程式碼裡面我們引用了ERC20的合約,路徑在這:https://github.com/OpenZeppelin/openzeppelin-contracts,進到"/contracts/token"裡面就可以找而很多ERC的合約了,Import進來你的合約內就可以引用了,程式碼內是引用了ERC20合約,也就是乙太幣的合約,我重寫了ERC20的decimals,把原本18位改為9位,各位也可以試著override ERC20裡面的其他方法。

OpenZeppelin還蠻常會用到的,因為上面有寫好的ERC合約範本,用這種公開的範本會比自己創建的來的安全,OpenZeppelin後面我們也會再看到,這部份有空再做介紹,這邊只要會引用就可以了。

ImportContract的部份各位就可以自己Deploy上去玩看看,我這邊就不再貼上來了,只是要注意的是:MyToken在Deploy時,記得要給NAMESYMBOL

raw-image
raw-image

由於MyToken我們引用了ERC20合約,所以MyToken也就是一個ERC20的合約了,這部份各位可以玩看看,以上就是Import的介紹,有什麼錯誤的地方也歡迎留言跟我說,謝謝。

有什麼想要了解或是不清楚的部份,歡迎留言和我分享。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。

留言
avatar-img
留言分享你的想法!
avatar-img
宅D嘉的開發人生
20會員
45內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
看更多